題目描述:
給出基數為 -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 ...