Given a non-empty array of integers nums, every element appears twice except for one. Find that single one.
function singleNumber(nums) {
let sum=0;
for (let i=0;i<nums.length;i++){
sum=sum^nums[i];
}
return sum;
}
目前題目以解決,方法是用indexof去判斷是否存在,在用splice去移除相同的值,去看討論大都以此^去處理,想請問在^運算中,明白XOR不同為1相同為0,可是這樣是怎麼不用IF ELSE就可以知道不同的值是甚麼?目前對於這個解法仍有不懂之處想請大大幫忙解惑
到JSFiddle執行以下程式
然後看顯示出來的每次 sum 計算後的結果
看看是否能回答你的問題
var arr = [10, 10, 20 , 20, 30];
console.log(singleNumber(arr));
arr = [10, 10, 20 , 30, 30];
var result = singleNumber(arr);
function singleNumber(nums) {
let sum=0;
for (let i=0;i<nums.length;i++){
sum=sum^nums[i];
console.log(i, sum);
}
return sum;
}
想請問海綿大大consloe出來後result的結果
0 10
1 0
2 20
3 10
4 20
在計算每項值第4次為甚麼console會是3 10 不是 3 20?!
你要轉成二進位來看
0 10 00000 01010 => 01010
1 0 01010 01010 => 00000
2 20 00000 10100 => 10100
3 10 10100 11110 => 01010
4 20 01010 11110 => 10100
因為 20^30 = 10
了解了~~學習到新的方法 謝謝各位
listennn08大大寫得真好,一目了然
我原本想舉的例子是 1,1,0,0,1 和 1,1,0,1,1
不過怕會跟 bit/integer 造成混淆而作罷
想額外差個話題~請問這種寫法運用到實際運作時會建議改成這種寫作方式嗎?
寫程式就是為了解決問題
而通常一個問題可以有多種寫法(解決方法)
就看當下的考量和選擇了
我剛剛寫了另一種「抄襲」的寫法, 也可以加減看看
var arr = [10, 10, 20 , 20, 30];
console.log(singleNumber(arr));
arr = [10, 10, 20 , 30, 30];
console.log(singleNumber(arr));
arr = [10, 20, 20 , 30, 30];
console.log(singleNumber(arr));
function singleNumber(nums) {
let sign=1;
let sum=0;
for (let i=0;i<nums.length;i++){
sum=sum + nums[i]*sign;
sign = -1 * sign;
console.log(i, sum);
}
return sum;
}
好的謝謝幫忙解惑