面試題 求a,b兩種方法

2021-06-28 19:49:57 字數 734 閱讀 7640

網上看到的乙個面試題:

長度為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...