diff --git a/solution/0100-0199/0137.Single Number II/README.md b/solution/0100-0199/0137.Single Number II/README.md index 380f5e4329ad4..7befb363ad3ff 100644 --- a/solution/0100-0199/0137.Single Number II/README.md +++ b/solution/0100-0199/0137.Single Number II/README.md @@ -146,6 +146,19 @@ function singleNumber(nums: number[]): number { } ``` +#### JavaScript + +```js +function singleNumber(nums) { + let ans = 0; + for (let i = 0; i < 32; i++) { + const count = nums.reduce((r, v) => r + ((v >> i) & 1), 0); + ans |= count % 3 << i; + } + return ans; +} +``` + #### Rust ```rust @@ -319,6 +332,22 @@ function singleNumber(nums: number[]): number { } ``` +#### JavaScript + +```js +function singleNumber(nums) { + let a = 0; + let b = 0; + for (const c of nums) { + const aa = (~a & b & c) | (a & ~b & ~c); + const bb = ~a & (b ^ c); + a = aa; + b = bb; + } + return b; +} +``` + #### Rust ```rust @@ -343,4 +372,74 @@ impl Solution { + + +### 方法三:哈希表 + 数学 + + + +#### TypeScript + +```ts +function singleNumber(nums: number[]): number { + const sumOfUnique = [...new Set(nums)].reduce((a, b) => a + b, 0); + const sum = nums.reduce((a, b) => a + b, 0); + return (sumOfUnique * 3 - sum) / 2; +} +``` + +#### JavaScript + +```js +function singleNumber(nums) { + const sumOfUnique = [...new Set(nums)].reduce((a, b) => a + b, 0); + const sum = nums.reduce((a, b) => a + b, 0); + return (sumOfUnique * 3 - sum) / 2; +} +``` + + + + + + + +### 方法四:位运算 + + + +#### TypeScript + +```ts +function singleNumber(nums: number[]): number { + let [ans, acc] = [0, 0]; + + for (const x of nums) { + ans ^= x & ~acc; + acc ^= x & ~ans; + } + + return ans; +} +``` + +#### JavaScript + +```ts +function singleNumber(nums) { + let [ans, acc] = [0, 0]; + + for (const x of nums) { + ans ^= x & ~acc; + acc ^= x & ~ans; + } + + return ans; +} +``` + + + + + diff --git a/solution/0100-0199/0137.Single Number II/README_EN.md b/solution/0100-0199/0137.Single Number II/README_EN.md index 65c7a2543a182..81e2ceb8cb0a5 100644 --- a/solution/0100-0199/0137.Single Number II/README_EN.md +++ b/solution/0100-0199/0137.Single Number II/README_EN.md @@ -137,6 +137,19 @@ function singleNumber(nums: number[]): number { } ``` +#### JavaScript + +```js +function singleNumber(nums) { + let ans = 0; + for (let i = 0; i < 32; i++) { + const count = nums.reduce((r, v) => r + ((v >> i) & 1), 0); + ans |= count % 3 << i; + } + return ans; +} +``` + #### Rust ```rust @@ -310,6 +323,22 @@ function singleNumber(nums: number[]): number { } ``` +#### JavaScript + +```js +function singleNumber(nums) { + let a = 0; + let b = 0; + for (const c of nums) { + const aa = (~a & b & c) | (a & ~b & ~c); + const bb = ~a & (b ^ c); + a = aa; + b = bb; + } + return b; +} +``` + #### Rust ```rust @@ -334,4 +363,74 @@ impl Solution { + + +### Solution 3: Set + Math + + + +#### TypeScript + +```ts +function singleNumber(nums: number[]): number { + const sumOfUnique = [...new Set(nums)].reduce((a, b) => a + b, 0); + const sum = nums.reduce((a, b) => a + b, 0); + return (sumOfUnique * 3 - sum) / 2; +} +``` + +#### JavaScript + +```js +function singleNumber(nums) { + const sumOfUnique = [...new Set(nums)].reduce((a, b) => a + b, 0); + const sum = nums.reduce((a, b) => a + b, 0); + return (sumOfUnique * 3 - sum) / 2; +} +``` + + + + + + + +### Solution 4: Bit Manipulation + + + +#### TypeScript + +```ts +function singleNumber(nums: number[]): number { + let [ans, acc] = [0, 0]; + + for (const x of nums) { + ans ^= x & ~acc; + acc ^= x & ~ans; + } + + return ans; +} +``` + +#### JavaScript + +```ts +function singleNumber(nums) { + let [ans, acc] = [0, 0]; + + for (const x of nums) { + ans ^= x & ~acc; + acc ^= x & ~ans; + } + + return ans; +} +``` + + + + + diff --git a/solution/0100-0199/0137.Single Number II/Solution.js b/solution/0100-0199/0137.Single Number II/Solution.js new file mode 100644 index 0000000000000..97db05ced7237 --- /dev/null +++ b/solution/0100-0199/0137.Single Number II/Solution.js @@ -0,0 +1,8 @@ +function singleNumber(nums) { + let ans = 0; + for (let i = 0; i < 32; i++) { + const count = nums.reduce((r, v) => r + ((v >> i) & 1), 0); + ans |= count % 3 << i; + } + return ans; +} diff --git a/solution/0100-0199/0137.Single Number II/Solution2.js b/solution/0100-0199/0137.Single Number II/Solution2.js new file mode 100644 index 0000000000000..b9385331291d2 --- /dev/null +++ b/solution/0100-0199/0137.Single Number II/Solution2.js @@ -0,0 +1,11 @@ +function singleNumber(nums) { + let a = 0; + let b = 0; + for (const c of nums) { + const aa = (~a & b & c) | (a & ~b & ~c); + const bb = ~a & (b ^ c); + a = aa; + b = bb; + } + return b; +} diff --git a/solution/0100-0199/0137.Single Number II/Solution3.js b/solution/0100-0199/0137.Single Number II/Solution3.js new file mode 100644 index 0000000000000..8b8ab60c7e109 --- /dev/null +++ b/solution/0100-0199/0137.Single Number II/Solution3.js @@ -0,0 +1,5 @@ +function singleNumber(nums) { + const sumOfUnique = [...new Set(nums)].reduce((a, b) => a + b, 0); + const sum = nums.reduce((a, b) => a + b, 0); + return (sumOfUnique * 3 - sum) / 2; +} diff --git a/solution/0100-0199/0137.Single Number II/Solution3.ts b/solution/0100-0199/0137.Single Number II/Solution3.ts new file mode 100644 index 0000000000000..02674c63ff57c --- /dev/null +++ b/solution/0100-0199/0137.Single Number II/Solution3.ts @@ -0,0 +1,5 @@ +function singleNumber(nums: number[]): number { + const sumOfUnique = [...new Set(nums)].reduce((a, b) => a + b, 0); + const sum = nums.reduce((a, b) => a + b, 0); + return (sumOfUnique * 3 - sum) / 2; +} diff --git a/solution/0100-0199/0137.Single Number II/Solution4.js b/solution/0100-0199/0137.Single Number II/Solution4.js new file mode 100644 index 0000000000000..dde5cb51e40c5 --- /dev/null +++ b/solution/0100-0199/0137.Single Number II/Solution4.js @@ -0,0 +1,10 @@ +function singleNumber(nums) { + let [ans, acc] = [0, 0]; + + for (const x of nums) { + ans ^= x & ~acc; + acc ^= x & ~ans; + } + + return ans; +} diff --git a/solution/0100-0199/0137.Single Number II/Solution4.ts b/solution/0100-0199/0137.Single Number II/Solution4.ts new file mode 100644 index 0000000000000..d4d59d1de5afc --- /dev/null +++ b/solution/0100-0199/0137.Single Number II/Solution4.ts @@ -0,0 +1,10 @@ +function singleNumber(nums: number[]): number { + let [ans, acc] = [0, 0]; + + for (const x of nums) { + ans ^= x & ~acc; + acc ^= x & ~ans; + } + + return ans; +}