查找数组中不存在的两个数字

问题描述:已知一个数组中存储了不大于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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值