找出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];
	}
}

  

时间: 2024-10-11 03:50:10

找出1-100中缺失的两个数的相关文章

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数

题目描述: 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数.   你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用.示例:给定 nums = [2, 7, 11, 15], target = 9返回 [0, 1] 思路: 第一层for循环从索引0到倒数第二个索引拿到每个数组元素,第二个for循环遍历上一层for循环拿到的元素的后面的所有元素. 具体代码: 1 public class Solution { 2 public int[] twoSum(int[] nums,

在数组中找出只出现一次的两个数

来来来,看一道面试题!!! 题目是这样叙述的: 在一个数组中除两个数字只出现1次外,其它数字都出现了2次, 要求尽快找出这两个数字. 要求:时间复杂度为O(N),空间复杂度为O(1). 这该怎么解决呢??? 请看我的分析: 将这道题简单化: 一个数组中只有一个数字出现一次,其他数字都是成对出现的,这时我们可以根据异或运算符的特性:A^B^A = B; 0 ^ A = A:我们可以将这个数组的全部元素依次做异或运算,最终结果就是那个只出现一次的数字. 如果这个数组中出现两个不同的数字,而其他数字均

输入一串数字找出其中缺少的最小的两个数

Description There is a permutation without two numbers in it, and now you know what numbers the permutation has. Please find the two numbers it lose. Input There is a number Tshows there are T test cases below. (T<=10)  For each test case , the first

找出排序数组中重复数字的个数

开始我的思路是先二分查找找到一个,然后再两边分别看个数. 但是这种方法会退化到O(n).效率不好. 所以更好的方法是,先找出第一个,再找出最后一个.这个在二分查找的时候,通过判断条件的处理,是能够获得的. 比较基本的思路是,如果找到的数=k,那么判断前面一个数是不是k,如果不是,停止查找,这个是第一个:如果是的,那么继续在前半部分查找.领悟.

从列表中找出和为某个常数的两个数

class Solution(object): def twoSum(self, nums, target): dic = {} for i, num in enumerate(nums): if num in dic: return [dic[num], i] else: dic[target - num] = i x=Solution() l=[1,3,5,6] print(x.twoSum(l,9)) 输出 [1, 3] 原文地址:https://www.cnblogs.com/sea-s

程序员面试100题之十:快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值(转)

能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解. 假如有如下的两个数组,如图所示: 5,6,1,4,7,9,8 给定Sum= 10 1,5,6,7,8,9 给定Sum= 10 分析与解法 这个题目不是很难,也很容易理解.但是要得出高效率的解法,还是需要一番思考的. 解法一 一个直接的解法就是穷举:从数组中任意取出两个数字,计算两者之和是否为给定的数字. 显然其时间复杂度为N(N-1)/2即O(N^2).这个算法很简

一组数中,只有两个数只出现了奇数次,其他所有数都是成对出现的,请找出那两个数

先看一个简单的,一组数中,只有一个数只出现了奇次,其他所有数都是成对出现的,找出出现奇次数的数.对于这个题,我们只需对所有数及逆行异或即可.理论公式: a⊕b=b⊕a a⊕0=a a⊕b⊕b=a a⊕(b⊕c)=(a⊕b)⊕c 代码: #include <stdio.h> #include <stdlib.h> int main() { int arr[] = { 1, 2, 3, 4, 1, 2, 3 }; int ret = 0; int len = sizeof(arr) /

刷题之给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数

今天下午,看了一会github,想刷个题呢,就翻出来了刷点题提高自己的实际中的解决问题的能力,在面试的过程中,我们发现,其实很多时候,面试官 给我们的题,其实也是有一定的随机性的,所以我们要多刷更多的题.去发现问题. 题目:     给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 解析: 实际这里就是给你的一个列表的数字,给你一个预期,让你返

找出十进制数中出现的&#39;&#39;一&#39;&#39;的个数

一.题目要求: 给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数. 要求: 1.写一个函数 f(N) ,返回1 到 N 之间出现的“1”的个数.例如 f(12)  = 5. 2.在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少. 二.解决思路 通过列举几个数进行计算,可以发现函数f(N)规律如下: 1.一位十进制数:当N>=1时,f(N)=1:当N=0时,f(N)= 0; 2.两位十进制数:f(13)=个位出现1的个数+十位出现1的个数=2+4