问题描述:已知一个数组中存储了不大于n的整数,每个数字不会重复,但是只有n-2个数字,让通过一次遍历能够找出没有出现的两个整数,要求空间复杂度是o(1).
public class MyTest {
private int []datas;// 整型数组来存放数据元素
private int n;//元素的个数
//在构造函数中初始化数组
public MyTest(int []datas,int n)
{
this.n=n;
this.datas=new int[n+1];//将第一个元素置零,为了处理起来方便
for(int i=1;i<n-1;i++)
this.datas[i]=datas[i];
this.datas[n-1]=-1;
this.datas[n]=-1;//没有存放元素用-1表示
}
//查找的过程
public void search()
{
int a=n;
int b=n-1;
int c=-1;//a,b,c三个数来存放哪些索引里面暂时没有存放数据,-1表示没有实际作用
int index=1;//index指示搜索到了哪个节点了
while(index<=n)
{
//如果数组元素是零说明已经处理过了,是-1表示还没有存放数据,直接处理下一个元素
if(datas[index]==0||datas[index]==-1)
index++;
else
{
//先将现在处理的这个元素进行处理,保存数据,将此处置为-1,将其索引保留
if(a==-1)
a=index;
else if(b==-1)
b=index;
else
c=index;
int value=datas[index];
datas[index]=-1;
boolean flag=false;//作为跳出循环的条件
while(!flag)
{
if(datas[value]!=-1)
{
int data=datas[value];
datas[value]=0;
value=data;
}
else
{
flag=true;
datas[value]=0;
if(a==value)
a=-1;
else if(b==value)
b=-1;
else
c=-1;
}
}
index++;
}
}
System.out.println("result:");
if(a!=-1)
System.out.println(a);
if(b!=-1)
System.out.println(b);
if(c!=-1)
System.out.println(c);
}
}
public class Sapp {
/**
* @param args
*/
public static void main(String[] args) {
int array[]={0,1,6,7,10,3,9,4,2};
MyTest test=new MyTest(array,array.length+1);
test.search();
}
}
上面的注释写得很清楚,我的思路就是将索引与其值对应,找到一个整数,将索引为这个整数的元素记录下来,然后将此索引处置为0。