谷歌给了我一个挑战:
你有L,一个包含一些数字(0到9)的列表。写一个函数解(L),它找到可以从一些或所有这些数字中得到的最大数字,并且可以被3整除。如果不可能生成这样的数字,返回0作为解。我将包含从1到9位数的任何地方。相同的数字可能在列表中出现多次,但列表中的每个元素只能使用一次。
所以我想出了以下代码:
import java.util.ArrayList;
import java.util.Collections;
public class Solution {
public static int solution(int[] l ) {
ArrayList<Integer> usable = new ArrayList<>();
ArrayList<Integer> mod1 = new ArrayList<>();
ArrayList<Integer> mod2 = new ArrayList<>();
// sort given numbers by mod 3
for (int i:l){
if (i % 3 == 0) usable.add(i);
else if (i % 3 == 1) mod1.add(i);
else mod2.add(i);
}
// add groups of 3 numbers that mod 3
while (mod1.size() >= 3){
for (int i = 0; i < 3; i++) usable.add(mod1.remove(0));
}
while (mod2.size() >= 3){
for (int i = 0; i < 3; i++) usable.add(mod2.remove(0));
}
// mod1 + mod2 == mod3
while (mod1.size() != 0 && mod2.size() !=0){
usable.add(mod1.remove(0));
usable.add(mod2.remove(0));
}
// if no usable elements i.e. {2,8}
if (usable.size() == 0) return 0;
// sort usable elements
Collections.sort(usable);
Collections.reverse(usable);
// convert arr into a number
int ans = 0;
for (int i: usable) {
ans = ans*10 + i;
}
return ans;
}
} 这对谷歌的大多数测试都有效,但它没有通过第四次测试。谁能告诉我我的密码哪里出错了吗?
发布于 2022-08-12 01:45:49
这个代码的各种问题。
比方说,作为输入,您有44477。您的代码将把所有这些数字都抛到mod1桶中。然后,它从那个桶(444)中获取前3个元素,并将它们视为可用的数字。
77人仍未使用。这就是你的错误所在,最好是774而不是444。
First problem:在取出数字之前,先对mod1和mod2桶(最高数字)进行排序。
第二个问题:您已经将输出强制为int,但是在java中,ints被定义为占用了价值32位的存储,这意味着它们只能表示[-2^31, +2^31-1]之间的所有数字和包含的所有数字。如果您试图超过这一点,int就定义了行为:数字“环绕”。你可以在行动中观察到这一点:
int x = Integer.MAX_VALUE; // constant representing 2^31 -1
System.out.println(x);
x = x + 1;
System.out.println(x);如果运行该操作,您将看到第二个print语句实际上打印了一个非常大的负数(实际上,“最大”负数:-2^31),因为+1操作导致int环绕(技术术语为“溢出”)。我不知道问题是如何发生的,但假设输入数字列表可以包含超过9位数字,这是一个问题-- int不够大。没有理由在这里乱搞int。完全不要将其转换回int。只需在没有空格的情况下逐个打印usable数组中的数字。如果您有一个包含[9, 9, 7, 4, 1]的列表,那么使用System.out.print单独打印每个元素,这将生成您想要的输出99741。而且它永远也不会使用int,这是有风险的,这与溢出问题有关。
如果问题描述明确要求您返回一个int值,那么我猜这不是一个问题。但是,这意味着如果输入可以包含9位以上的数字,那么问题就会像写的那样中断。(因为例如3333333333 -即10个3,所以不适合于一个函数,因此无论您做什么都不可能通过这个函数返回,至少在您更改它返回的内容之前是这样的。long为您提供了更多的数字,但是要支持任何长度,您必须返回一个String,或者将其发送到文件或标准输出,或者将答案从函数直接发送到任何地方。
当然,可能有比这两个问题更多的问题。
https://stackoverflow.com/questions/73328105
复制相似问题