如何循环遍历给定字符串中所有为0的字符



我正在尝试从整数中删除尾随的零,这是我迄今为止的代码。

import java.math.BigInteger;
public class newuhu {
public static int numTrailingZeros(int s) {
BigInteger J = BigInteger.valueOf(s);
String sb = J.toString();
String Y = "";
while (sb.length() > 0 && sb.charAt(sb.length() - 1) == '0') {
sb.replaceAll("0"," ");

}
return Integer.parseInt(Y);
}

注意:我把int变成了Biginteger,因为有人警告我,有些输入可能看起来像20!,即2.432902e+18

然而,我的IntelliJ调试工具告诉我变量sb不在循环中。因此,我试图了解必须做些什么才能确保sb处于循环中。

请理解,我是Java的初学者,所以,我正在尝试学习一些新的东西。

replaceAll将所有出现的字符串替换为您想要的字符(即空格(,这样您就根本不需要循环,而且您还担心溢出,所以您实际上应该使用BigInteger作为参数,而不是int(int不适合接近20的值!(,但您的代码还有另一个问题,你说你想替换后面的零,但现在你要用空白字符替换每个0,你应该试着使用这样的东西https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html

public class newuhu {
public static int numTrailingZeros(BigInteger s) {
String sb = s.toString();
return Integer.parseInt(sb.replaceAll("0", "")); // consider returning something else if you're working with BigInteger
}

请记住,在执行BigInteger.valueOf(int(时不会产生任何效果,因为对于int来说,过大的数字永远不会存储在int中。另外还有20!适用于内部

public static String trimTrailingZeros(String source) {
for (int i = source.length() - 1; i > 0; ++i) {
char c = source.charAt(i);
if (c != '0') {
return source.substring(0, i + 1);
}
}
return ""; // or return "0";
}

或者,如果您使用BigInteger。

public static BigInteger trimTrailingZeros(BigInteger num) {
while (num.remainder(BigInteger.TEN).signum() == 0) {
num = num.divide(BigInteger.TEN); 
}
return num;
}

这应该很快,因为您只创建了一个字符串(通过子字符串(。

(第一:变量和字段应以小写字母开头-当没有常量时。(

应该是

sb = sb.replaceAll(...)

由于sb没有被replaceAll改变,所以只返回被替换的值。String类为提供了不可变的值,这些值始终保持不变,因此您可以将一个变量分配给一个变量,并且更改其中一个变量的值永远不会影响另一个,也不会进一步共享。

那么它应该是:

sb = sb.replaceFirst("0$", "");

replaceAll将替换每一个0;23043500";至";23435";。

replaceFirst替换位于$末尾的_regular表达式:char"0"。

输入数字不可能溢出,因为您已经在传递int

public static int numTrailingZeros(int n) {
while (n != 0 && n % 10 == 0) {
n /= 10;
}
return n;
}
public static int numTrailingZeros(String n) {
n = n.replaceAll("0+", "");
if (n.isEmpty() || n.equals("-")) { // "-0" for pessimists?
n = "0";
}
return Integer.parseInt(n);
}

%是模运算符,整数除法的余数147%10==7。

这个名字有误导性,或者你在计算一些不同的东西。

public static int numTrailingZeros(int n) {
int trailingZeros = 0;
while (n != 0 && n % 10 == 0) {
n /= 10;
++trailingZeros ;
}
return trailingZeros ;
}

这里的问题是sb.replaceAll("0","")不会做任何事情。您正在丢弃包含替换字符串的返回值。请参见此处。

你可能想要的是这样的东西:

while (sb.length() > 0 && sb.charAt(sb.length() - 1) == '0') {
sb = sb.replaceAll("0"," ");

不过,我不确定您是否需要while循环。ReplaceAll将。。。用空格替换所有的零。

最新更新