標籤:

萌新刷題(一)A + B 問題

題目

給出兩個整數a和b, 求他們的和, 但不能使用 + 等數學運算符。顯然你可以直接 return a + b,但是你是否可以挑戰一下不這樣做?

題目鏈接 A + B 問題

思路

做加法不用四則運算?那麼用什麼呢?只剩下位運算了。

基本思路是這樣的:

A&B //看哪幾位有進位

A^B //不帶進位加

考慮二進位加法的過程,

步驟一、A^B,能夠得到沒有進位的加法。

步驟二、A&B,能夠得到相加之後,能夠進位的位置的信息。向左移動一位,就是兩個二進位數相加之後的進位信息。所以,(A&B)<<1就是兩個二進位數相加得到的「進位結果」。

步驟三、將前兩步的結果相加。相加的過程就是步驟一和步驟二,直到不再產生進位為止。

代碼

Python版本:

class Solution:n """n @param a: The first integern @param b: The second integern @return: The sum of a and bn """n def aplusb(self, a, b):n # write your code here, try to do it without arithmetic operators.n carry = 1n while carry != 0:n s = a ^ bn carry = (a & b) << 1n a = sn b = carryn return an

提交發現出錯

你的代碼運行時間超過了限制,檢查你的時間複雜度。TLE通常是由死循環造成的,思考一下你的時間複雜度是否是最優的。

c++版本

加入遞歸

class Solution {npublic:n /*n * @param a: The first integern * @param b: The second integern * @return: The sum of a and bn */n int aplusb(int a,int b){n if(a==0) return b;n if(b==0) return a;n int x = a^b;n int y = (a&b)<<1;n return aplusb(x,y);n}n};n

100%通過測試,畢竟是c++,速度就是快。

總結

基本思路

int A, B;

A&B //看哪幾位有進位

A^B //不帶進位加

寫完文章發現知乎也有原題不使用「+」號實現加法操作? - 知乎

同時給出Python陷入死循環的原因A + B without arithmetic operators, Python vs C++

一個人刷題是痛苦的,有人一起交流最好了,你也想一起來嗎?


推薦閱讀:

刷題大戰 09 代碼評審報告
std::make_index_sequence的簡單實現和簡單應用
GacUI:初步完成Workflow腳本轉C++的工作
《C++ Primer》讀書筆記-第七章 06 類的靜態成員
Roman To Integer

TAG:算法 | Python | C |