给定是一个列表,其中包含1-20之间的所有2个数字(随机排序).
我需要找到那两个数字.
这是我提出的(工作)计划:
public static void main(String[] args) {
int[] x= {1,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
ArrayList al= new ArrayList();
Map map= new HashMap();
for(int i=0;i
{
map.put(x[i], x[i]);
}
for(int i=1;i<=20;i++)
{
if(map.get(i)==null)
al.add(i);
}
for(int i=0;i
{
System.out.println(al.get(i));
}
}
我想从性能的角度(内存和bigO(n))知道程序是否良好?
解决方法:
你不需要地图.只是一个大小为20的额外布尔数组.
for (int i = 0; i < input.length; i++)
arr[input[i]] = true;
for (int i = 1; i <= 20; i++)
if (arr[i] == false) {
//number `i` is missing
}
现在我将展示一个简单的数学解决方案.
首先对数组中的所有数字求和.例如,对于1,2,3,4,5中的数字,您有5,1,4.因此缺少2和3.我们可以通过数学轻松找到它们.
5 + 1 + 4 = 10
1 + 2 + 3 + 4 + 5 = 15
所以我们知道x y = 15 – 10 = 5
现在我们将得到第二个等式:
1 * 4 * 5 = 20
1 * 2 * 3 * 4 * 5 = 120
=> x * y = 120 / 20 = 6
所以:
x + y = 5
x * y = 6
=> x = 2,y = 3或x = 3,y = 2,它们是相同的.
所以x = 2,y = 3
标签:java,performance,search,algorithm,arraylist
来源: https://codeday.me/bug/20190726/1542282.html