之前兩次那個是異或運算處理。這次以為也是類似。可是沒想出來。
高富帥想出來了演算法,轉為bitset,然後加起來 同樣的話 要麼0+0+0 要麼1+1+1,最後剩下的 能夠通過%3 算出0 或1。思想是這樣,
事實上也是bit運算。僅僅只是不是異或這樣的一次運算o(1)這樣的,可是因為輸入是int陣列,-2^31~2^31-1 所以用32bit就能夠表示了。
之前遇到,過幾次錯誤,包含分配儲存空間的問題,正如fawks說的。用全域性陣列,是在全域性區域,比棧空間大非常多。所以能夠申請大陣列,可是leetcode向來
不給資料範圍的,只是從int也能夠知道了,可是leetcode是class的,public成員貌似也是棧。結果出錯。順便說一下leetcode非常多wa都說成tle。。
。還有其它的型別指定錯誤。
。後來發現有個負數的問題,負數取模符號位是異或(-7/-4=1.....-3, -7/4=-1....-3, 7/-4=-1.....3, 7/4=1....3 因此也能夠歸納出,商的符號是除數被除數異或,餘數符號是被除數符號),於是這樣陣列就變成負數了,為了便於處理。都辯證。可是最後符號位怎麼判呢? 事實上都當成陣列處理,3m個1,3n個1 另乙個0/1,
加起來取模照樣把代表符號位的0 1取出來。
可是從報錯問題來看,另乙個-2^31出錯了,後來想想是的, 符號位變1,然後後面變為10000 1+31個0 結果那個1都裝不下了,於是他的補碼是10000000,所以要專門處理。
這裡實現了比較底層的。實現了補碼。
處理好邏輯後提交。最終過了t t
時間複雜度 o(32n)=o(n),空間複雜度o(1)
ps: **前面那些直接copy了圓神的**:)
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define min(a,b) (((a) < (b)) ?
(a) : (b)) #define max(a,b) (((a) > (b)) ? (a) : (b)) #define read freopen("in.txt","r",stdin) #define write freopen("out.txt","w",stdout) using namespace std; //#define maxbitnum 32 //#define maxnum 100000 //int bitnumvec[maxnum][maxbitnum]; int singlenumber(int a, int n) while(a[i]!=0) } //reverse(vec.begin(),vec.end()); } //memset(bitnum,0,sizeof(int)*maxbitnum); int bitnum[maxbitnum]; memset(bitnum,0,sizeof(int)*maxbitnum); int x=0; for(int i=0;i0) x+=bitnum[i]*pow(2.0,maxbitnum-1-i); } if(bitnum[0]==1 &&x !=0) x=-x; else if(bitnum[0]==1 && x==0) x=-pow(2.0,31); //for(int i=0;i 陣列中唯一出現1次的數 唯一出現2次的數
題目 乙個整型陣列裡除了1個數字之外,其他的數字都出現了兩次,請寫程式找出這個只出現一次的數字。要求時間複雜度是 o n 空間複雜度是 o 1 例如輸入陣列 2,4,3,3,2,5 因為只有 4 這個數字只出現一次,其他數字都出現了兩次,所以輸出 4 分析 本題以及延伸題目,在劍指offer上有詳細...
演算法題1 陣列中唯一出現1次的數 唯一出現2次的數
題目 乙個整型陣列裡除了1個數字之外,其他的數字都出現了兩次,請寫程式找出這個只出現一次的數字。要求時間複雜度是 o n 空間複雜度是 o 1 例如輸入陣列 2,4,3,3,2,5 因為只有 4 這個數字只出現一次,其他數字都出現了兩次,所以輸出 4 分析 本題以及延伸題目,在劍指offer上有詳細...
只出現一次的數
給定乙個整數陣列 nums,其中恰好有兩個元素只出現一次,其他所有元素均出現兩次。找出只出現一次的那兩個元素。示例 給定 nums 1,2,1,3,2,5 返回 3,5 注意 結果的順序並不重要,對於上面的例子 5,3 也是正確答案。你的演算法應該具有線性複雜度,你能否僅使用恆定的空間複雜度來實現它...