奇怪的字符串操作方法
本文关键字:操作方法 字符串 | 更新日期: 2023-09-27 18:29:26
我的同事正试图编写一个方法(在Java/C#中),该方法将在String
的末尾附加任意数量的零。然而,我似乎不知道他的方法是什么
这是Java代码,C#基本上是等价的:
String appendzeros(int input, int no_of_digits_required)
{
String result = Integer.toString(input);
int i,j;
for(i = 10, j = 1; i <= Math.pow(10, no_of_digits_required-1); i = i*10, j++)
{
if(input / i == 0)
{
for(int k = 1; k <= no_of_digits_required-j; k++)
result = "0" + result;
break;
}
}
return result;
}
有什么想法吗?
代码的基本思想是计算字符串化数字中有多少数字,然后添加"填充"零。
现在让我们看看如何。。。
String result = Integer.toString(input);
数字(5 => "5"
)的初始字符串化
for(i = 10, j = 1; i <= Math.pow(10, no_of_digits_required-1); i = i*10, j++)
i
将包含10的幂(101100010000100000……)我们知道我们可以在10^(no_of_digits_required-1)
处停止。为什么?我们稍后再看!j
是input
的位数(它是一个计数器,我们知道它至少有一个数字,因为即使0
也是由一个数字组成的)
if(input / i == 0)
不要看你看到的。。。这样想:意思是:第一次i
大于input
。这是因为我们使用整数除法,所以任何数字/任何较小的数字>=1,而任何数字/相同的数字==1和任何数字/较大的数字==0。(第一次,因为在if
中有一个break
,所以在第一次之后,for
周期将结束)
for(int k = 1; k <= no_of_digits_required-j; k++)
result = "0" + result;
在j
中,我们有数字的位数,所以no_of_digits_required-j
是我们需要的0
填充数。他使用的是1 <= k <= no_of_digits_required-j
,所以基数为1,而不是更经典的0 <= k < no_of_digits_required-j
(基数为0)
break;
我们还在if
里面。当我们第一次发现数字中有多少位数时,我们将其填充,然后得到"正确"的结果,并从"主"for
中断开。
现在唯一有趣的问题是为什么Math.pow(10, no_of_digits_required-1)
。答案很简单:如果你要求no_of_digits_required == 1
,那么这个循环是无用的,因为你永远不需要填充。i = 10
,i <= 10^(1-1)
=>i <= 1
,循环为否。对于no_of_digits_required == 2
,我们有i = 10
,i <= 10^(2-1)
=>i <= 10
,所以是一个单循环。这没关系,因为只有当数字<10(所以0…9)。事实上,if (input / i == 0)
只会"激活"0…9…范围内的输入,依此类推
我想你的前同事已经准备好参加C级比赛了!
每当我对代码有这些WTF时刻时,我发现手动执行通常有助于弄清楚发生了什么
result="3"
i=10
j=1
10<=循环体运行100次
如果3/10==0(整数除法为真)
对于k=1;k<=2
result="0"+结果
k=2;k<=2
result="0"+结果
内部用于循环返回外部用于循环
i=100
j=2
100<=100所以运行环体
如果3/100==0,则运行环路的内部
k=1
1<=1
result="0"+结果
并完成"0003"
i、 j都在不同的"数字空间"中跟踪相同的东西(结果有多少位数宽),我通过小数点的宽度来跟踪它,而j通过10的幂来跟踪它。循环中的if使你达到10的正幂,开始加零。
在我看来,只有当输入为0时,它才会插入"0",并且会根据要求添加0。这本可以写得更好的