有趣的C++演算法_(:з」∠)___web

來源:互聯網
上載者:User
摘要

在刷演算法題的過程中,被一些大神的想法折服,方知天外有天,山外有山_(:з」∠)_

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.