需求:算法實現將數字每三位用逗號隔開:1,213,123,456,789
算法一
觀察規律得:
將整數從右向左每一個數字字符編上序號,每數三位數,數字前面有一個逗號,規律是:當數字所在的序號剛好被3整除時,這個數字前面有逗號;
翻譯成編碼思想:
我們將每個數字字符從右向左數的序號定義為Pos;
1、定義一個list 將數字按照規律處理后添加到該list :var list=new List
2、循環整數的每一個數字字符:for(int i=0;i<str.length;i++)
2、如果Pos%30,在list里面添加一個‘,’,考慮臨界值最高位不顯示逗號 : if(Pos%30 && Pos!=str.Length){list.add(',');}
3、list里面添加當前字符 list.add(數字字符)
4、每個數字字符從右向左數的序號Pos=字符串的長度-當前字符在字符串中的索引:Pos=str.Length-i;
所以代碼為:
/// <summary>
///格式化數字格式為三位逗號隔開,小數點后不需要隔開
/// </summary>
/// <param name="numStr"></param>
/// <returns></returns>
public static string FormatNumberic(string numStr)
{
double defdb = 0;
var isNum=double.TryParse(numStr, out defdb);
if (!isNum) return "";
var parts = numStr.Split('.');
string partFloat = "";
if (parts.Length > 1) { partFloat = "."+ parts[1]; }
string partInt = parts[0];
List<char> cl = new List<char>();
//循環整數的每一個字符
for (int i = 0; i < partInt.Length; i++)
{
// pos 當前字符位於整個字符串從右向左從1開始的序號
var pos = partInt.Length-i;
if (pos%3==0 && pos!= partInt.Length)
{
cl.Add(',');
}
cl.Add(partInt[i]);
}
return string.Join("", cl.ToArray()) + partFloat;
}
算法二
觀察規律得:
將字符串reverse之后:0123456789 再根據字符索引 (i+1)%3==0 :012,345,678,9
再Reverse之后為9,876,543,210
所以代碼如下:
public static string FormatNumberComaByReverse( string numStr) {
List<char> Lc = new List<char>();
var charArray= numStr.ToCharArray();
Array.Reverse(charArray);
for (int i = 0; i < charArray.Length; i++)
{
Lc.Add(charArray[i]);
if ((i+1) % 3 == 0 && i != charArray.Length-1)
{
Lc.Add(',');
}
}
Lc.Reverse();
return String.Join("", Lc.ToArray());
}
心得體會:
寫算法之前,一定要認真仔細觀察規律,保證是合理的,能想得通的,而不是在半吊子的過程中試錯試出來的自己都看不懂的代碼。
雖然做對了,但是沒有理解,遇到相似情況仍然不能解決。