-2

我有一个谷歌 foobar 挑战:

编写一个名为 answer(data, n) 的函数,该函数接收一个少于 100 个整数的列表和一个数字 n,并返回相同的列表,但将所有出现超过 n 次的数字完全删除。返回的列表应保留与原始列表相同的顺序 - 您不想混淆那些精心计划的轮班轮换!例如,如果 data 是 [5, 10, 15, 10, 7] 并且 n 是 1,则 answer(data, n) 将返回列表 [5, 15, 7] 因为 10 出现了两次,因此从完整列出。

这是我的回答:

    public static int[] solution(int[] data, int n) {
        // Your code here
        int count,c=0;
        int flag[]=new int[1000];
        int b[]=new int[data.length];
        for(int i=0;i<data.length;i++)
        {   count=0;
            if(flag[(data[i])]==0)
            {
                for(int j=0;j<data.length;j++)
                {
                    if(data[i]==data[j])
                        count++;
                }
                if(count>n)
                    flag[(data[i])]=1; 
                else
                {
                    flag[(data[i])]=2;
                    b[c++]=data[i];
                }
            }
            else if(flag[(data[i])]==2)
            {
                b[c++]=data[i];
            }
        }
        if(c==(data.length))
        {
            return b;
        }
        if(c==0)
        {
            int ne[]=new int[0];
            return ne;
        }
        else
        {
            int ne[]=new int[c];
            for(int k=0;k<c;k++)
            {
                ne[k]=b[k];
            }
            return ne;
        }
    }

它通过了 8 个测试用例,但最后一个测试用例失败了,我无法弄清楚测试用例会是什么,因为那个测试用例是隐藏用例。任何想法?

4

1 回答 1

0

通常,在尝试查找问题时,您会运行测试。我把你的代码片段变成了一个我可以学习的类。

我格式化了你的代码,以便更清楚地看到你在做什么。使用更具描述性的变量名称会有所帮助。此外,不要依赖不需要大括号的 if 或 for 循环的单个语句。第一次尝试添加一行代码时,忘记了大括号,祝你调试好运。

这是我创建的测试类。在尝试了大约两打不同的 N 值和输入后,我找不到任何东西。

import java.util.Arrays;

public class GoogleChallenge {

    public static void main(String[] args) {
        int[] data = { 5, 10, 15, 10, 7, 888, 999, 999, 0 };
        int n = 1;
        System.out.println("input: n: " + n + " " + Arrays.toString(data));
        System.out.println("Output: " + Arrays.toString(solution(data, n)));
    }

    public static int[] solution(int[] data, int n) {
        // Your code here
        int count, c = 0;
        int flag[] = new int[1000];
        int b[] = new int[data.length];
        for (int i = 0; i < data.length; i++) {
            count = 0;
            if (flag[(data[i])] == 0) {
                for (int j = 0; j < data.length; j++) {
                    if (data[i] == data[j]) {
                        count++;
                    }
                }
                if (count > n) {
                    flag[(data[i])] = 1;
                } else {
                    flag[(data[i])] = 2;
                    b[c++] = data[i];
                }
            } else if (flag[(data[i])] == 2) {
                b[c++] = data[i];
            }
        }
        
        if (c == (data.length)) {
            return b;
        }
        
        if (c == 0) {
            int ne[] = new int[0];
            return ne;
        } else {
            int ne[] = new int[c];
            for (int k = 0; k < c; k++) {
                ne[k] = b[k];
            }
            return ne;
        }
    }

}
于 2021-10-11T20:42:29.507 回答