網上看到的乙個面試題:
長度為n的陣列,由數字1到n組成,其中數字a不出現,數字b出現兩次,其它的數字恰好出現一次。怎樣通過唯讀遍歷一次陣列,找出數字a和b;
只能遍歷一次:
方法1:首先想到的是列方程組,直接求解a,b;
(1)等式1 :s1為1…n的和 s1=n(n+1)/2; 而s2是給定陣列的和
這樣的話,根據題意有,s1=s2+a-b;
(2)等式2: 平方和。 s3=1^2+2^2……n^2=n(n+1)(2n+1)/6;而s4是給定陣列的平方和。
所以有 s3=s4+ a^2-b^2 ;
兩個等式可以求解,注意,有分母一定要通分,防止整除有誤差。 該方法有個缺點:就是平方和容易溢位問題。
方法2:利用構造hash陣列,統計陣列中數字個數,要是當前為2,則此b = s[i],一次遍歷出s2;
這樣a = s1-s2 + b; 即可,就很簡單了。
下面給出方法2的**:
void cal_a_b()
;// int n=9;
int *value_hash_map = new int[n+1];
int s1=n*(n+1)/2;
int s2=0;
int a,b=0;
memset(value_hash_map,0,sizeof(int)*(n+1));
for(int i =0;i
面試題目 單鏈表的反轉(兩種方法)
2.3 2.4 總結 3 方式二 新建鍊錶,頭節點插入法 3.3 3.4 總結 單鏈表node的資料結構定義如下 class listnode 2.1 思路 把當前鍊錶的下乙個節點pcur插入到頭結點dummy的下乙個節點中,就地反轉。dummy 1 2 3 4 5的就地反轉過程 dummy 2 1...
劍指offer 面試題16 反轉鍊錶(兩種方法)
題目 定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出反轉後鍊錶的頭結點。在解決問題前,先想好測試用例 1 功能測試 輸入的鍊錶含有多個結點,鍊錶中只有乙個結點 2 特殊輸入測試 頭結點為 null指標 解決這個問題有兩種方式 前提 這兩種方式 是以 頭結點並不是第乙個資料節點 為基準 表示的。...
LCA兩種方法
lca least common ancestors 即最近公共祖先,是指在有根樹中,找出某兩個結點u和v最近的公共祖先。模板題 anc i j 表示第i個點的2 j的祖先的標號 整個過程就是兩個點往上跳到同一深度,再一起往上跳找到lca include include using namespac...