摘要
在刷演算法題的過程中,被一些大神的想法折服,方知天外有天,山外有山_(:з」∠)_
NOTICE: 以下代碼均基於C++11 實現 判斷迴文
bool judge(const string& str){ string _str = str; reverse(str.begin(),str.end()); return str==_str;} 轉換進位
void trans(){ int dec_num = 0; cin>>hex>>dec_num; cout<<dec_num;}input: 0x16output: 22
void trans(){ int dec_num = 22; cout<<hex<<dec_num;}output: 0x16 求一個整數或負數的補碼中1的個數
public int NumberOf1(int n) { int count = 0; while(n!= 0){ count++; n = n & (n - 1); } return count; }
舉個例子:一個位元1100,從右邊數起第三位是處於最右邊的一個1。減去1後,第三位變成0,它後面的兩位0變成了1,而前面的1保持不變,因此得到的結果是1011.我們發現減1的結果是把最右邊的一個1開始的所有位都取反了。這個時候如果我們再把原來的整數和減去1之後的結果做與運算,從原來整數最右邊一個1那一位開始所有位都會變成0。如1100&1011=1000.也就是說,把一個整數減去1,再和原整數做與運算,會把該整數最右邊一個1變成0.那麼一個整數的二進位有多少個1,就可以進行多少次這樣的操作。 不用加減乘除做加法
Q: 寫一個函數,求兩個整數之和,要求在函數體內不得使用+、-、*、/四則運算子號。
S:
int Add(int num1, int num2){ while(num2!=0){ //這裡不能寫成num2>0,因為還有負數呢 int tmp = num1^num2; num2 = (num1&num2)<<1; num1 = tmp; } return num1;}
首先看十進位是如何做的: 5+7=12,三步走
第一步:相加各位的值,不算進位,得到2。
第二步:計算進位值,得到10. 如果這一步的進位值為0,那麼第一步得到的值就是最終結果。
第三步:重複上述兩步,只是相加的值變成上述兩步的得到的結果2和10,得到12。
同樣我們可以用三步走的方式計算二進位值相加: 5-101,7-111 第一步:相加各位的值,不算進位,得到010,二進位每位相加就相當於各位做異或操作,101^111。
第二步:計算進位值,得到1010,相當於各位做與操作得到101,再向左移一位得到1010,(101&111)<<1。
第三步重複上述兩步, 各位相加 010^1010=1000,進位值為100=(010&1010)<<1。
繼續重複上述兩步:1000^100 = 1100,進位值為0,跳出迴圈,1100為最終結果。 求1+2+3+…+n
Q: 要求不能使用乘除法、for、while、if、else、switch、case等關鍵字及條件判斷語句(A?B:C)。
S: 利用&&運算子的驟死性
int Sum_Solution(int n) { int ans = n; ans && (ans+=Sum_Solution(n-1)); return ans;} 求旋轉字串子串
Q: 求字串從第n個字元前後旋轉的字串
比如string(abcdef), 若n為3, 則輸出為string(defabc)
解法一:
void reverseString(string A, int n){ return (A+A).substr(n,A.size());}
解法二: 這個比較有技術含量
假設我們所求的字串兩部分為A和B,原字串為AB,則我們要求的是BA,有如下關係式:
BA = (A’B’)’ (這裡我們假設X’為X的轉置)
代碼如下
void reverseString(string A, int n){ reverse(A.begin(), A.begin()+n); reverse(A.begin()+n, A.end()); reverse(A.begin(), A.end()); return A;}
完美解決。_(:з」∠)_ ! 在不佔用額外記憶體空間的情況下(即不使用緩衝矩陣),將數字矩陣順時針旋轉90度
//解法//順時針90度: 首先上下翻轉,再按照主對角線翻轉 1 2 3 7 8 9 7 4 1 4 5 6 —> 4 5 6 ---> 8 5 2 7 8 9 1 2 3 9 6 3//逆時針90度: 首先按照主對角線翻轉,再上下翻轉 1 2 3 1 4 7 3 6 9 4 5 6 —> 2 5 8 ---> 2 5 8 7 8 9 3 6 9 1 4 7