1073 負二進位制數相加

2021-10-13 17:15:53 字數 1724 閱讀 5255

題目描述:

給出基數為 -2 的兩個數 arr1 和 arr2,返回兩數相加的結果。

數字以 陣列形式 給出:陣列由若干 0 和 1 組成,按最高有效位到最低有效位的順序排列。例如,arr = [1,1,0,1] 表示數字 (-2)^3 + (-2)^2 + (-2)^0 = -3。陣列形式 的數字也同樣不含前導零:以 arr 為例,這意味著要麼 arr == [0],要麼 arr[0] == 1。

返回相同表示形式的 arr1 和 arr2 相加的結果。兩數的表示形式為:不含前導零、由若干 0 和 1 組成的陣列。

示例:

輸入:arr1 = [1,1,1,1,1], arr2 = [1,0,1]

輸出:[1,0,0,0,0]

解釋:arr1 表示 11,arr2 表示 5,輸出表示 16 。

1 <= arr1.length <= 1000

1 <= arr2.length <= 1000

arr1 和 arr2 都不含前導零

arr1[i] 為 0 或 1

arr2[i] 為 0 或 1

方法1:

(1)-2為基數,會導致奇數字上的1代表的是減去某個值,相鄰位上的1代表的含義是相減,而不是相加,故相鄰位的進製應該是進-1,但隔開一位再進一位時,應該是進製為1,且造成當前為1,既進製減去當前位的值,依舊不變,則兩數相加時,每個位上的可能值就是 -1,0,1,2,3;

(2)為了陣列相加從低位開始方便,將陣列先進行反轉操作;

(3)最後根據進製情形,壓入對應個數的1;

(4)為了最後表示的數除了0本身,最高位不能為0,需要進行彈出0的操作;

class

solution

else

if(isize()

)else

//當前位可能獲得的結果

switch

(cur)}if

(carry==1)

else

if(carry==-1

)//避免高位可能為0的情形

while

(res.

size()

>

1&&res.

back()

==0)//反轉獲得結果

reverse

(res.

begin()

,res.

end())

;return res;}}

;

方法2:

主要思路:

(1)思路基本和上述一致,但只是為了避免反轉情形,直接從後向前遍歷,獲得結果;

class

solution

else

if(i>=0)

else

switch

(cur)}if

(carry==1)

else

if(carry==-1

)++pos;

while

(res[pos]==0

&&possize()

-1)//返回指定範圍的結果

return vector<

int>

(res.

begin()

+pos,res.

end())

;}};

1073 負二進位制數相加

class solution object def addnegabinary self,arr1,arr2 type arr1 list int type arr2 list int rtype list int d if arr1 0 sum1 0 else sum1 0 for i in ra...

5078 負二進位制數相加

給出基數為 2的兩個數arr1和arr2,返回兩數相加的結果。數字以陣列形式給出 陣列由若干 0 和 1 組成,按最高有效位到最低有效位的順序排列。例如,arr 1,1,0,1 表示數字 2 3 2 2 2 0 3。陣列形式的數字也同樣不含前導零 以arr為例,這意味著要麼arr 0 要麼arr 0...

leetcode 5078 負二進位制數相加 C語言

演算法思想 先用快取將列加結果儲存起來,其中可能包括 2的數字 將其中不等於1或者0的,進行進製換算 2時,進製 1 等於 1是,將本位置為1,高一位 1 void reve int arr,int len 將其中不等於1或者0的,進行進製換算 2時,進製 1 等於 1是,將本位置為1,高一位 1 ...