奇怪的字符串操作方法

本文关键字:操作方法 字符串 | 更新日期: 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)处停止。为什么?我们稍后再看!jinput的位数(它是一个计数器,我们知道它至少有一个数字,因为即使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 = 10i <= 10^(1-1)=>i <= 1,循环为否。对于no_of_digits_required == 2,我们有i = 10i <= 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。这本可以写得更好的