反转长Java的最快方法
反转长值的最快方法是什么 例如,9876543210应返回0123456789 这就是我现在拥有的:反转长Java的最快方法,java,reverse,long-integer,Java,Reverse,Long Integer,反转长值的最快方法是什么 例如,9876543210应返回0123456789 这就是我现在拥有的: long n = 0, c = 987654321 * 10; // *10 is to get 9876543210 as long value; while (c > 0) n = n * 10 + c % 10; System.out.println(n); 您的程序遇到了一个无限循环,因为您从未更改c的值。在每次迭代结束时加上c/=10,它就会起作用,尽管前导零会因为是一个数字而
long n = 0, c = 987654321 * 10; // *10 is to get 9876543210 as long value;
while (c > 0) n = n * 10 + c % 10;
System.out.println(n);
您的程序遇到了一个无限循环,因为您从未更改c的值。在每次迭代结束时加上c/=10,它就会起作用,尽管前导零会因为是一个数字而被删除
long n = 0, c = 9876543210L;
while (c > 0){
n = n * 10 + c % 10;
c /= 10;
}
System.out.println(n);
如果需要有前导零,则应该考虑使用字符串。
long c = 9876543210L;
final StringBuilder sb = new StringBuilder();
while (c > 0){
sb.append(c % 10);
c /= 10;
}
System.out.println(sb.toString());
您的程序遇到了一个无限循环,因为您从未更改c的值。在每次迭代结束时加上c/=10,它就会起作用,尽管前导零会因为是一个数字而被删除
long n = 0, c = 9876543210L;
while (c > 0){
n = n * 10 + c % 10;
c /= 10;
}
System.out.println(n);
如果需要有前导零,则应该考虑使用字符串。
long c = 9876543210L;
final StringBuilder sb = new StringBuilder();
while (c > 0){
sb.append(c % 10);
c /= 10;
}
System.out.println(sb.toString());
我想这可能很快
long x = 1234567890L;
String reversed = new StringBuilder(Long.toString(x)).reverse().toString();
// reversed = "0987654321"
如果要再次将反向值转换为长值:
我想这可能很快
long x = 1234567890L;
String reversed = new StringBuilder(Long.toString(x)).reverse().toString();
// reversed = "0987654321"
如果要再次将反向值转换为长值:
您可以简单地转换为字符串,然后还原字符串,特别是如果您希望在最后输出字符串。这应该是非常直接的,它的前导值为0,也可能比计算每个位置的速度更快,但valueOf的转换成本可能会抵消这一优势:
long c = 9876543210L;
String cAsString = String.valueOf(c);
StringBuilder builder = new StringBuilder();
for (int i = 0; i < cAsString.length(); i++) {
builder.append(cAsString.substring(cAsString.length() - (i + 1), cAsString.length() - i));
}
System.out.println(builder.toString());
我对当前答案的选项做了一点比较:
public static void main(String[] args) {
Instant start = Instant.now();
for (long i = 0; i < 100_000_000; i++) {
stringbuilderWithDirectCalcs(i);
}
Duration duration = Duration.between(start, Instant.now());
System.out.println("Took " + duration);
}
protected static void stringbuilderWithDirectCalcs(long value) {
final StringBuilder sb = new StringBuilder();
while (value > 0) {
sb.append(value % 10);
value /= 10;
}
// System.out.println(sb.toString());
}
protected static void stringbuilderConvenient(long value) {
String reverted = new StringBuilder(String.valueOf(value)).reverse().toString();
//System.out.println(reverted);
}
protected static void stringbuilderHandCrafted(long value) {
String cAsString = String.valueOf(value);
StringBuilder builder = new StringBuilder();
for (int i = 0; i < cAsString.length(); i++) {
builder.append(cAsString.substring(cAsString.length() - (i + 1), cAsString.length() - i));
}
//System.out.println(builder.toString());
}
因此,用手扫描字符串并将StringBuilder一步一步地粘在一起似乎是不可能的。显然,Stephen C在他的评论中是正确的,当转换为字符串时,计算无论如何都会发生。但是基于Stringbuilder.reverse和手工计算每个位置的方法非常接近,任何差异都可能是由于运行时的微小波动造成的。因此,您可能会选择StringBuilder.reverse方法,而不是手动计算每个位置,以获得大致相同的可读性。您可以简单地转换为字符串,然后还原字符串,特别是如果您希望最终输出字符串。这应该是非常直接的,它的前导值为0,也可能比计算每个位置的速度更快,但valueOf的转换成本可能会抵消这一优势:
long c = 9876543210L;
String cAsString = String.valueOf(c);
StringBuilder builder = new StringBuilder();
for (int i = 0; i < cAsString.length(); i++) {
builder.append(cAsString.substring(cAsString.length() - (i + 1), cAsString.length() - i));
}
System.out.println(builder.toString());
我对当前答案的选项做了一点比较:
public static void main(String[] args) {
Instant start = Instant.now();
for (long i = 0; i < 100_000_000; i++) {
stringbuilderWithDirectCalcs(i);
}
Duration duration = Duration.between(start, Instant.now());
System.out.println("Took " + duration);
}
protected static void stringbuilderWithDirectCalcs(long value) {
final StringBuilder sb = new StringBuilder();
while (value > 0) {
sb.append(value % 10);
value /= 10;
}
// System.out.println(sb.toString());
}
protected static void stringbuilderConvenient(long value) {
String reverted = new StringBuilder(String.valueOf(value)).reverse().toString();
//System.out.println(reverted);
}
protected static void stringbuilderHandCrafted(long value) {
String cAsString = String.valueOf(value);
StringBuilder builder = new StringBuilder();
for (int i = 0; i < cAsString.length(); i++) {
builder.append(cAsString.substring(cAsString.length() - (i + 1), cAsString.length() - i));
}
//System.out.println(builder.toString());
}
因此,用手扫描字符串并将StringBuilder一步一步地粘在一起似乎是不可能的。显然,Stephen C在他的评论中是正确的,当转换为字符串时,计算无论如何都会发生。但是基于Stringbuilder.reverse和手工计算每个位置的方法非常接近,任何差异都可能是由于运行时的微小波动造成的。因此,可以选择StringBuilder.reverse方法,而不是手动计算每个位置,以获得大致相同性能的可读性。*10是将9876543210作为长值;-只需执行9876543210L。将长值转换为字符串,然后反转字符串。请注意,如果将前导零保持为长值,则每次前导零都将被剥离。*10表示将9876543210作为长值;-只需执行9876543210L。将长值转换为字符串,然后反转字符串。请注意,如果您将前导零保留很长时间,它每次都会被剥离。使用String.fromValue并将其还原不是更快吗?没有计算只涉及数组运算…@FrankHopkins你有什么建议?@FrankHopkins-我不确定它一定会是。长->字符串转换在引擎盖下重复除以10和模数10。你为什么不做个实验?该死,对不起。。。我编辑了你的答案而不是我的。。。将查找撤消按钮…@FrankHopkins不用担心。使用String.fromValue然后将其还原不是更快吗?没有计算只涉及数组运算…@FrankHopkins你有什么建议?@FrankHopkins-我不确定它一定会是。长->字符串转换在引擎盖下重复除以10和模数10。你为什么不做个实验?该死,对不起。。。我编辑了你的答案而不是我的。。。将查找撤消按钮…@FrankHopkins别担心。@georgezhang006请注意,从字符串返回long,例如by long.parseLongreversed可能会删除前导零,导致987654321。是的,当然。我不知道提问者想如何使用这个反向值,但如果作为一个数字,那么在开始和结束时修剪0是很重要的end@georgezhang006请注意,从字符串返回long,例如by long.parseLongreversed可能会删除前导零,从而导致987654321。是的,当然。我不知道提问者想如何使用这个反向的值,但是如果作为一个数字,那么在开始时修剪0是很重要的,在结束时修剪0是很重要的,除非它不能避免每个位置的计算。它们发生在内部。看看源代码…除了它不能避免每个位置的计算。它们发生在内部。看看源代码。。。