遇到了一个需求,要把“12000.00001.00010.00032.00100” ; “00145.00002.12005.07042” ;“05439.07008.02070” 这样的编码转换成“12000.1.10.32.100” ; “145.2.12005.7042” ;“5439.7008.2070” 这样的形式。
分析
乍一看这个需求并不难,只是简单的把0移除就行了,但是仔细思考一下,如果是简单的用Replace方法来做,那就会让10,100这样的数字变为1,所以得自己写一个方法。
先考虑到可以将编码拆分,拆分之后的编码就分别变成了12000 ;00001;00010;00032;00100,这样,我们再根据第一个不是0的数字,来进行一个定位,获得了第一个不是0的定位之后,来对单独的字符串删除,最后再将删除后的单独字符串合并到一起。
方法
根据思路,我们写出了方法:
public static string ChangeTheCode(string s)
{
string result = "";
string[] sArray = s.Split('.');//通过“.”来拆分字符串
for (int j = 0; j < sArray.Count(); j++)
{
string test = sArray[j];
if (!test.Contains("0"))//没有0则直接添加
{
result = result + "." + test;
}
else//有0则查找第一个非0的标签
{
for (int i = 0; i < test.Length; i++)
{
string a = test.Substring(i, 1);//逐个判断是否是0
if (!a.Equals("0"))
{
int index = i;
result = result + "." + test.Remove(0, index);
break;
}
}
}
}
if (result.StartsWith("."))//如果开头有“.”,就把它去掉
{
result = result.Remove(0, 1);
}
return result;
}
方法调用
class Program
{
static void Main(string[] args)
{
string s = "12000.00001.00010.00032.00100";
Console.WriteLine(ChangeTheCode(s));
string a = "00145.00002.12005.07042";
Console.WriteLine(ChangeTheCode(a));
string b = "05439.07008.02070";
Console.WriteLine(ChangeTheCode(b));
Console.ReadKey();
}
最后的执行结果如图:
思考
因为博主的数据结构学的不是太好,所以在写方法的过程中,没有怎么考虑到编程的时间复杂度。
让我们这一个简单的需求,时间复杂度达到了O(n²),博主才疏学浅,希望各位大佬有好的方法,指点一二。
另一种方法
根据网友weixin_43602823 提供的方法:
public static string ChangeTheCode2(string s)
{
string result = "";
string[] sArray = s.Split('.');
for (int i = 0; i < sArray.Length; i++)
{
result = result + "." + int.Parse(sArray[i]);
}
result = result.Trim('.');
return result;
}
我们可以看到代码非常简洁,而且也能完美的实现需求(针对纯数字型的编码)。
再次感谢这位网友!!!
案例
看到这么多人需要,于是我写了个小程序,用来帮大家给编码补0或者去0,下面是程序界面(本人才疏学浅,设计比较简陋),源码的下载目录已经附上,用WPF写的,有需要的可以自取。
源码下载链接:https://download.csdn.net/download/weixin_46433786/14948165