Q:對(duì)于一個(gè)自然數(shù)組,數(shù)組元素范圍從1到n+2,一共n個(gè)元素,找到缺失的兩個(gè)元素。
A:遍歷一次,可以得到整個(gè)數(shù)組的和以及平方和;當(dāng)不缺失元素時(shí),1到n+2的和以及平方和當(dāng)然是已知的。對(duì)于缺失的兩個(gè)元素x和y,則有如下關(guān)系:x + y=m,x^2 + y^2=n;m為和的差,n為平方和的差。
import java.util.*;
import java.util.concurrent.*;
public class 自然數(shù)組里面缺失的兩個(gè)數(shù)
{
/**
*@param arr 輸入數(shù)組
*@param n 數(shù)組元素的范圍從1到n
*@return 缺失的兩個(gè)數(shù)組成的數(shù)組
*/
public static int[] findMissingTwo(int[] arr,int n)
{
long sum=0;
long sum2=0;
for (int i=0;i<arr.length ;i++ )
{
sum+=arr[i];
sum2+=(long)Math.pow(arr[i],2);
}
long sum_all=0;
long sum2_all=0;
for (int i=1;i<=n ;i++ )
{
sum_all+=i;
sum2_all+=i*i;
}
int diff=(int)(sum_all-sum);
int diff2=(int)(sum2_all-sum2);
int[] res=new int[2];
for (int i=1;i<=n ;i++ )
{
if (i*i+(diff-i)*(diff-i)==diff2)
{
res[0]=Math.min(i,diff-i);
res[1]=Math.max(i,diff-i);
break;
}
}
return res;
}
public static int[] findMissingTwoBad(int[] arr,int n)
{
int[] helper=new int[n];
for (int i=0;i<arr.length ;i++)
{
helper[arr[i]-1]=1;
}
int[] res=new int[2];
int index=0;
for (int i=0;i<helper.length ;i++ )
{
if (helper[i]!=1)
{
res[index++]=i;
}
}
return res;
}
public static void main(String[] args)
{
Set<Integer> set=new HashSet<>();
ThreadLocalRandom rand=ThreadLocalRandom.current();
for (int times=0;times<500 ;times++ )
{
int end=rand.nextInt(3,200);
while (set.size()<end-2)
{
int temp=rand.nextInt(1,end);
set.add(temp);
}
int[] arr=new int[end-2];
int i=0;
for (int temp:set )
arr[i++]=temp;
int[] res=findMissingTwo(arr,end);
int[] resBad=findMissingTwo(arr,end);
String str=Arrays.toString(res);
String strBad=Arrays.toString(resBad);
if (!str.equals(strBad))
System.out.println("fuck man");
set.clear();
}
}
}
如果上來(lái)就是想到常規(guī)的排序,數(shù)組的各種華麗操作,是無(wú)法解題的。頗有點(diǎn)智力題的意味,需要的知識(shí)儲(chǔ)備最多是高中水平,還是在于考察一個(gè)人邏輯思維能力。