首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Google foobar最大数字%3

Google foobar最大数字%3
EN

Stack Overflow用户
提问于 2022-08-12 00:25:00
回答 1查看 44关注 0票数 0

谷歌给了我一个挑战:

你有L,一个包含一些数字(0到9)的列表。写一个函数解(L),它找到可以从一些或所有这些数字中得到的最大数字,并且可以被3整除。如果不可能生成这样的数字,返回0作为解。我将包含从1到9位数的任何地方。相同的数字可能在列表中出现多次,但列表中的每个元素只能使用一次。

所以我想出了以下代码:

代码语言:javascript
复制
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;
    }
} 

这对谷歌的大多数测试都有效,但它没有通过第四次测试。谁能告诉我我的密码哪里出错了吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-12 01:45:49

这个代码的各种问题。

比方说,作为输入,您有44477。您的代码将把所有这些数字都抛到mod1桶中。然后,它从那个桶(444)中获取前3个元素,并将它们视为可用的数字。

77人仍未使用。这就是你的错误所在,最好是774而不是444。

First problem:在取出数字之前,先对mod1mod2桶(最高数字)进行排序。

第二个问题:您已经将输出强制为int,但是在java中,ints被定义为占用了价值32位的存储,这意味着它们只能表示[-2^31, +2^31-1]之间的所有数字和包含的所有数字。如果您试图超过这一点,int就定义了行为:数字“环绕”。你可以在行动中观察到这一点:

代码语言:javascript
复制
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,或者将其发送到文件或标准输出,或者将答案从函数直接发送到任何地方。

当然,可能有比这两个问题更多的问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73328105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档