1. 程式人生 > >找出1-100中缺失的兩個數

找出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/)。實現程式碼如下:

/*
	author:<song0071000#126.com>
	time:2014/03/25
	function:find two number in array
*/
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];
	}
}

如有其它更好方法,歡迎討論!

本人享有部落格文章的版權,轉載請標明出處http://blog.csdn.net/baidu20008

相關推薦

1-100缺失個數

題目:有一個數組 int array[100];本來應該存放的數為1~100,但是有兩個資料a,b丟失了,值變成了0。問如何找出丟失的那兩個數?附帶條件不能開闢額外的空間。 解題思路:常見的兩種解法有:1.計算a+b和a*b的值,然後在解方程求解(但是這樣會使得中間某個變數

前端演算法之 某個陣列個數之和跟目標值相等,並獲取這個數在陣列的位置

 此函式,規避了陣列中的某個數值被重複使用的問題,譬如說 傳入的陣列為[2,2,3,4,5]目標值是4,得到值不會是[0,0]而是[0,1] var twoSum = function(nums, target) { let ayy = []; for (let i=0

常見演算法 - 0~n不重複的n個數排序 && 快1~n被替換成0的數

面試中被問到的兩道題。 1.一個連續的整數序列,存放的是0到99(n)這100個不重複的數,是亂序的,要求將其排序。      思路:藉助於陣列,相應位置儲存對應的數值,因為其是0~n不重複的,所以剛剛好。   &nbs

0~n不重複的n個數排序 && 快1~n被替換成0的數

面試中被問到的兩道題。1.一個連續的整數序列,存放的是0到99(n)這100個不重複的數,是亂序的,要求將其排序。     思路:藉助於陣列,相應位置儲存對應的數值,因為其是0~n不重複的,所以剛剛好。                for(int i = 0;i <

無序陣列和為N的個數 Two Sum

如果是有序陣列,很簡單。兩頭指標往中間相遇即可。 因此對於無序陣列,排序即可。 唯一的麻煩題目要求的:要返回兩個數在排序之前原數組裡的序號。因此我需要在排序時也要保留原來的序列號。 這裡主要是以前不寫STL的程式。這裡用到vector。pair。sort。 vector常

素數打表——1~100以內的素數

esp ace ++ str clu += iostream space ostream 素數篩選法: #include <iostream> using namespace std; //素數打表模板 bool is_prime[100]; i

用MATLAB1~100的素數

MATLAB巢狀迴圈允許使用一個迴圈在另一迴圈內,下面用一個巢狀迴圈來把所有從1到100的素數顯示出來。 1. 建立指令碼檔案,程式碼如下: for i = 2 : 100 %外層迴圈,i的初值為2,

一個輸入的陣列長度為101,陣列範圍[1,100],存在一個數重複,重複的數

  /********************************************* *函式功能: 一個輸入的陣列中長度為101,陣列範圍[1,100],存在一個數重複,找出重複的數 *引數說明 * 輸入: [1,2,4,5,6,...,39,39,40,41,

二進位制表示1個數相同,且大小最接近的那個數

public int getNext(int n){/*計算c0和c1*/int c=n;int c0=0;int c1=0;while(((c&1)==0) && (c!=0)){c0++;c>>=1;}while((c&1)==1){c1++;c>>

C程式設計實現,一個數只有個數不是成對出現,個數

#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> void Find(int *arr, int sz, int *p1, int *p2) { int num = 0; int i

go語言實現--個數個數,這個數之和等於一個給定的值

前幾天面試的時候問了我一道演算法題,題目是 :快速找出一個數組中的兩個數字,讓這兩個數字之和等於一個給定的值所以把它記錄下來解法一:窮舉,從陣列中任意取出兩個數字,計算兩者之和是否為給定的數字,時間複雜

典型的Top K演算法 _找出個數組裡面前K個最大數_找出1億個浮點數最大的10000個_一個文字檔案,找出前10個經常出現的詞,但這次檔案比較長,說是上億行或十億行,總之無法一次讀入記憶體.

        搜尋引擎會通過日誌檔案把使用者每次檢索使用的所有檢索串都記錄下來,每個查詢串的長度為1-255位元組。         假設目前有一千萬個記錄(這些查詢串的重複度比較高,雖然總數是1千萬,但如果除去重複後,不超過3百萬個。一個查詢串的重複度越高,說明查詢

100個數最大的前K個數(海量TopK問題)

對於這個問題,可以有以下思考: 給了多少記憶體儲存這100億個資料? 先思考:堆排序效率是nlogn,再思考:可以將這些資料切成等份,再從每一份中找出最大前k個數據,但是效率不高。那如果利用堆的性質呢? 小堆堆頂元素最小,先將前k個數建成小堆,那麼堆頂元素

數組只出現1次的數

ret ++ [] return 等於 for void 中一 sys 任何數字異或自己都等於0,兩次重復的數字異或之後抵消,最後剩下只有1個的數字知識點:任何數字異或0等於自身按位與 a&b 只有雙方為1 才為1 按位或 | 其中一方有1 才為1按位異或 ^

Java1~n之內的素數

找出1~n內的素數 下面是今天解決的問題,輸入一個n上限,找到1~n之間素數的個數,並且打印出素數, 素數: 質數(prime number)又稱素數,有無限個。一個大於1的自然數,除了1和它本身外,不能被其他自然數整除, 黎曼猜想: 素數在自然數中的分佈問題在純粹

python實現從字串特定字元的位置以及個數的方法

python實現從字串中找出特定字元的位置以及個數的方法 本文例項主要實現給出任意字串,獲取字串中某字元的位置以及出現的總次數。 實現該功能程式碼的時候可以使用函式enumerate來將字串分離成位置和字元,然後進行比較即可。 具體實現程式碼如下: #!/b

字串------01串o和1連續出現的最大次數

題目: 思路: 記錄遍歷中的最大值,與temp比較,並交換 程式碼: void Calculate(const char *str,int *max0,int *max1) { int temp0=0; //儲存0串的最大長度 int temp1=

編寫函式,1-1000之內所有能被7整除或被11整除,但不能同時被7和11整除的數,放到A所指的陣列內,並返回個數

#include<stdio.h> int f(int a[]) { int i = 0,n; for(n = 1;n <=1000;n++) { if(n%7==0 || n%11==0) //能被7整除或被11整除

資料結構——連結串列(1)如何連結串列的倒數第k個元素

方法一:①遍歷連結串列,得到連結串列的長度n的值;②將倒數的k的序號轉換到順序排號(n-k+1);③遍歷連結串列,直到找到第(n-k+1)個元素。兩次遍歷,時間複雜度為O(n)。 方法二:從第一個元素開始,遍歷k個元素,判斷呢是否為NULL,若為空,則找到第k