我正在尝试从整数中删除尾随的零,这是我迄今为止的代码。
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将。。。用空格替换所有的零。