zoukankan      html  css  js  c++  java
  • 找出1-100中缺失的两个数

    题目:有一个数组 int array[100];本来应该存放的数为1~100,但是有两个数据a,b丢失了,值变成了0。问如何找出丢失的那两个数?附带条件不能开辟额外的空间。

    解题思路:常见的两种解法有:1.计算a+b和a*b的值,然后在解方程求解(但是这样会使得中间某个变量过大)。2.使用bit位来标记。占用13个字节。第二种方法使用了额外空间,第一种可能会造成整型溢出。这里考虑转化为熟悉的方法。数组array[100],其下标正好为0-99,能不能利用上数组下标求解呢?答案是肯定的。这里将数组下标加一,变为1-100。将题目转化为array[0]...array[99]以及1-100 这总共200个数中,两个只出现一次的数(解法http://zhedahht.blog.163.com/blog/static/2541117420071128950682/)。实现代码如下:

    void find_lost_two(int array[],int length,int* num1,int* num2)
    {
    	*num1 = 0;
    	*num2 = 0;
    	int temp = 0,i;
    	/* 计算200个数的异或和 */
    	for(i=0;i<100;i++)
    	{
    		temp ^=(i+1);
    		temp ^=array[i];
    	}
    
    	int first_not_zero=1;
    	/*找出异或和的最低1的位数*/
    	while(temp%2 == 0)
    	{
    		first_not_zero++;
    		temp = temp>>1;
    	}
    	/*按1进行划分*/
    	for(i=0;i<100;i++)
    	{
    		if(((1<<(first_not_zero-1))&(i+1)) == 0)
    
    			*num1 ^=(i+1);
    		else
    			*num2 ^=(i+1);
    		if(((1<<(first_not_zero-1))&array[i]) == 0)
    			*num1 ^=array[i];
    		else
    			*num2 ^=array[i];
    	}
    }
    

      

  • 相关阅读:
    day07_final
    day06_final
    day02_final
    day04_final
    New
    AtCoder Grand Contest 015 E Mr.Aoki Incubator
    长链剖分学习笔记
    关于某些莫队的优化
    CodePlus 2019 3月月赛 Div.1 A题 TREE
    边分治学习笔记
  • 原文地址:https://www.cnblogs.com/kkshaq/p/4544276.html
Copyright © 2011-2022 走看看