我正在研究Google foobar挑战,并且我有10次成功7次。测试用例是隐藏的。您可以通过建议测试用例或指出您认为不对的地方来提供帮助吗?
问题:
编写一个名为answer(data,n)的函数,该函数接收少于100个整数和数字n的列表,并返回该列表,但将出现n次以上的所有数字完全删除。返回的列表应保留与原始列表相同的顺序-您不想混淆那些经过精心计划的轮换!例如,如果数据为[5,10,15,10,7]并且n为1,由于10两次出现,因此answer(data,n)将返回列表[5,15,7],因此已从列表中将其删除。完整列出。
要提供Python解决方案,请编辑solution.py 要提供Java解决方案,请编辑solution.java
输入: (整数列表)数据= [1、2、3] (整数)n = 0 输出: (int列表)[]
输入: (整数列表)数据= [1、2、2、3、3、3、4、5、5] (整数)n = 1 输出: (整数列表)[1,4]
输入: (整数列表)数据= [1、2、3] (整数)n = 6 输出: (int列表)[1、2、3]
代码
public static int[] answer(int[] data, int n)
{
HashMap<Integer, Integer> map = new HashMap<>();
ArrayList<Integer> data2 = new ArrayList<Integer>();
int count=0;
for(int x:data)
{
if(!map.containsKey(x))
{
map.put(x,1);
}
else if(map.containsKey(x))
{
count=map.get(x);
count+=1;
map.put(x,count);
}
}
for(int y:map.keySet())
{
if(map.get(y)<=n) {
data2.add(y);
}
}
int[] data3 = new int[data2.size()];
for(int i=0;i<data2.size();i++){
data3[i] = data2.get(i);
}
return data3;
}
public static void main(String[] args) {
int[] thisss = {};
int[] ans=answer(thisss,1);
for(int x: ans)
{
System.out.println(x);
}
}
答案 0 :(得分:0)
我不能为您提供确切的解决方案,因为这是来自竞争的问题,但是您可以从此python解决方案中获得一些想法。
注意:关于insertion order
from collections import defaultdict
def answer(data,n):
data = data[:100]
counter_dict = defaultdict(int)
ignore_num_set = set()
for num in data:
if num not in ignore_num_set:
counter_dict[num] +=1
if counter_dict[num] > n:
del counter_dict[num]
ignore_num_set.add(num)
return list(counter_dict.keys())
print(answer([97,5,10,15,10,7,8,7,5,15,2,3,42],1)) #[97, 8, 2, 3, 42]