iT邦幫忙

0

LeetCode ^的運算

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就可以知道不同的值是甚麼?目前對於這個解法仍有不懂之處想請大大幫忙解惑

https://ithelp.ithome.com.tw/articles/10213278
>明白XOR不同為0相同為1
相同為 0 不同才是 1
qpalzm iT邦新手 1 級 ‧ 2020-11-12 14:28:17 檢舉
抱歉~剛剛昏了 打錯
已修正~ 謝謝兩位大大
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
海綿寶寶
iT邦大神 1 級 ‧ 2020-11-12 14:06:04
最佳解答

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;

    }
看更多先前的回應...收起先前的回應...
qpalzm iT邦新手 1 級 ‧ 2020-11-12 14:18:43 檢舉

想請問海綿大大consloe出來後result的結果
0 10
1 0
2 20
3 10
4 20
在計算每項值第4次為甚麼console會是3 10 不是 3 20?!/images/emoticon/emoticon06.gif

你要轉成二進位來看

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

qpalzm iT邦新手 1 級 ‧ 2020-11-12 14:32:10 檢舉

了解了~~學習到新的方法 謝謝各位/images/emoticon/emoticon41.gif

listennn08大大寫得真好,一目了然/images/emoticon/emoticon12.gif

我原本想舉的例子是 1,1,0,0,1 和 1,1,0,1,1
不過怕會跟 bit/integer 造成混淆而作罷

qpalzm iT邦新手 1 級 ‧ 2020-11-12 14:34:41 檢舉

想額外差個話題~請問這種寫法運用到實際運作時會建議改成這種寫作方式嗎?

寫程式就是為了解決問題
而通常一個問題可以有多種寫法(解決方法)
就看當下的考量和選擇了

我剛剛寫了另一種「抄襲」的寫法, 也可以加減看看

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;

    }
qpalzm iT邦新手 1 級 ‧ 2020-11-12 14:48:40 檢舉

好的謝謝幫忙解惑

我要發表回答

立即登入回答