Find value that occurs in odd number of elements
Clash Royale CLAN TAG#URR8PPP
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty margin-bottom:0;
up vote
1
down vote
favorite
I am trying to solve the following exercise using Javascript:
A non-empty array A consisting of N integers is given. The array contains an odd number of elements, and each element of the array can be paired with another element that has the same value, except for one element that is left unpaired.
For example, in array A such that:
A[0] = 9 A[1] = 3 A[2] = 9
A[3] = 3 A[4] = 9 A[5] = 7
A[6] = 9
the elements at indexes 0 and 2 have value 9,
the elements at indexes 1 and 3 have value 3,
the elements at indexes 4 and 6 have value 9,
the element at index 5 has value 7 and is unpaired.
I have written the following code.
function solution(A)
var pop;
if(!A.length)
return 0;
while(A.length)
pop = A.shift();
let pos = A.indexOf(pop);
if(pos >-1)
A.splice(pos,1);
else
return pop
return pop;
The correctness seems to be fine but it fails the performance test. The order shown is O(N**2).
- Any explanation why it shows exponential timing (I have not used any
nested loops)? - Any suggestions on what would be the optimized code which will run on O(N) having space complexity O(1)?
javascript algorithm array time-limit-exceeded iteration
add a comment |Â
up vote
1
down vote
favorite
I am trying to solve the following exercise using Javascript:
A non-empty array A consisting of N integers is given. The array contains an odd number of elements, and each element of the array can be paired with another element that has the same value, except for one element that is left unpaired.
For example, in array A such that:
A[0] = 9 A[1] = 3 A[2] = 9
A[3] = 3 A[4] = 9 A[5] = 7
A[6] = 9
the elements at indexes 0 and 2 have value 9,
the elements at indexes 1 and 3 have value 3,
the elements at indexes 4 and 6 have value 9,
the element at index 5 has value 7 and is unpaired.
I have written the following code.
function solution(A)
var pop;
if(!A.length)
return 0;
while(A.length)
pop = A.shift();
let pos = A.indexOf(pop);
if(pos >-1)
A.splice(pos,1);
else
return pop
return pop;
The correctness seems to be fine but it fails the performance test. The order shown is O(N**2).
- Any explanation why it shows exponential timing (I have not used any
nested loops)? - Any suggestions on what would be the optimized code which will run on O(N) having space complexity O(1)?
javascript algorithm array time-limit-exceeded iteration
add a comment |Â
up vote
1
down vote
favorite
up vote
1
down vote
favorite
I am trying to solve the following exercise using Javascript:
A non-empty array A consisting of N integers is given. The array contains an odd number of elements, and each element of the array can be paired with another element that has the same value, except for one element that is left unpaired.
For example, in array A such that:
A[0] = 9 A[1] = 3 A[2] = 9
A[3] = 3 A[4] = 9 A[5] = 7
A[6] = 9
the elements at indexes 0 and 2 have value 9,
the elements at indexes 1 and 3 have value 3,
the elements at indexes 4 and 6 have value 9,
the element at index 5 has value 7 and is unpaired.
I have written the following code.
function solution(A)
var pop;
if(!A.length)
return 0;
while(A.length)
pop = A.shift();
let pos = A.indexOf(pop);
if(pos >-1)
A.splice(pos,1);
else
return pop
return pop;
The correctness seems to be fine but it fails the performance test. The order shown is O(N**2).
- Any explanation why it shows exponential timing (I have not used any
nested loops)? - Any suggestions on what would be the optimized code which will run on O(N) having space complexity O(1)?
javascript algorithm array time-limit-exceeded iteration
I am trying to solve the following exercise using Javascript:
A non-empty array A consisting of N integers is given. The array contains an odd number of elements, and each element of the array can be paired with another element that has the same value, except for one element that is left unpaired.
For example, in array A such that:
A[0] = 9 A[1] = 3 A[2] = 9
A[3] = 3 A[4] = 9 A[5] = 7
A[6] = 9
the elements at indexes 0 and 2 have value 9,
the elements at indexes 1 and 3 have value 3,
the elements at indexes 4 and 6 have value 9,
the element at index 5 has value 7 and is unpaired.
I have written the following code.
function solution(A)
var pop;
if(!A.length)
return 0;
while(A.length)
pop = A.shift();
let pos = A.indexOf(pop);
if(pos >-1)
A.splice(pos,1);
else
return pop
return pop;
The correctness seems to be fine but it fails the performance test. The order shown is O(N**2).
- Any explanation why it shows exponential timing (I have not used any
nested loops)? - Any suggestions on what would be the optimized code which will run on O(N) having space complexity O(1)?
javascript algorithm array time-limit-exceeded iteration
edited Jul 12 at 22:59
Dannnno
5,3581649
5,3581649
asked Jul 12 at 21:12
Anirban Bera
83
83
add a comment |Â
add a comment |Â
3 Answers
3
active
oldest
votes
up vote
1
down vote
accepted
Any explanation why it shows exponential timing (I have not used any nested loops)?
Inside the while loop you have A.indexOf(pop);
which is the second inner loop. It iterates over each item until it finds the match. You can use a Set which uses a hash table to locate items.
Any suggestions on what would be the optimized code which will run on O(N)?
Use a Set
. For each item first check the set, if its there remove it and the item, else add the item to the set and move to the next item. When done you should have one item remaining in the set, that will be the odd one out.
function findOdd(arr)
const found = new Set();
while (arr.length > 0)
const val = arr.pop(); // or use shift
// if val in found remove it from the set
if (found.has(val)) found.delete(val)
else found.add(val) // else add it to the set
return [...found.values()][0];
Elegant solution! Can you confirm the worst case space complexity of this? I think it is O(1) (not counting the storage required for input arguments) - correct me if I'm wrong.
â Anirban Bera
Jul 13 at 4:26
@AnirbanBera Sorry O(n) space for hash tables. See wiki en.wikipedia.org/wiki/Hash_table
â Blindman67
Jul 13 at 5:01
// if val in found remove it from the set
comment is useless.
â Stexxe
Jul 13 at 11:37
add a comment |Â
up vote
0
down vote
The solution with an O(N) time complexity with O(1) space is a little bit hacky. The solution is to xor each number together. some important properties of xor are:
- xor of two identical numbers is zero.
- xor of any number and zero is the number.
- xor is commutative.
- xor is associative.
example:
A = [9, 3, 9, 3, 9, 7, 9]
the solution to this example is:
(((((9^3)^9)^3)^9)^7)^9
= 9^3^9^3^9^7^9 (4)
= 9^9^9^9^3^3^7 (3)
= (9^9)^(9^9)^(3^3)^7 (3)
= 0^0^0^7 (1)
= 7 (2)
add a comment |Â
up vote
0
down vote
We can find unpaired number by sorting array of integers and searching for one, which has no adjacent with same value.
My suggested solution:
const nextIsDifferent = (el, index, arr) => ((index + 1) % 2 === 1 && el !== arr[index + 1]);
const findUnpaired = (arr) => arr.sort().find(nextIsDifferent);
console.log(findUnpaired([9, 3, 9, 3, 9, 7, 9]));
You have supplied an alternative solution, without saying how or why it is better. If you could add some details, this would make a nice answer.
â Graipher
Jul 13 at 12:33
This is also a nice solution. Can you please elaborate on the time complexity of it? will it be O(N) or O(NlogN) <for sorting>?
â Anirban Bera
Jul 13 at 15:58
I think it's O(NlogN)
â Stexxe
Jul 13 at 20:41
add a comment |Â
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
1
down vote
accepted
Any explanation why it shows exponential timing (I have not used any nested loops)?
Inside the while loop you have A.indexOf(pop);
which is the second inner loop. It iterates over each item until it finds the match. You can use a Set which uses a hash table to locate items.
Any suggestions on what would be the optimized code which will run on O(N)?
Use a Set
. For each item first check the set, if its there remove it and the item, else add the item to the set and move to the next item. When done you should have one item remaining in the set, that will be the odd one out.
function findOdd(arr)
const found = new Set();
while (arr.length > 0)
const val = arr.pop(); // or use shift
// if val in found remove it from the set
if (found.has(val)) found.delete(val)
else found.add(val) // else add it to the set
return [...found.values()][0];
Elegant solution! Can you confirm the worst case space complexity of this? I think it is O(1) (not counting the storage required for input arguments) - correct me if I'm wrong.
â Anirban Bera
Jul 13 at 4:26
@AnirbanBera Sorry O(n) space for hash tables. See wiki en.wikipedia.org/wiki/Hash_table
â Blindman67
Jul 13 at 5:01
// if val in found remove it from the set
comment is useless.
â Stexxe
Jul 13 at 11:37
add a comment |Â
up vote
1
down vote
accepted
Any explanation why it shows exponential timing (I have not used any nested loops)?
Inside the while loop you have A.indexOf(pop);
which is the second inner loop. It iterates over each item until it finds the match. You can use a Set which uses a hash table to locate items.
Any suggestions on what would be the optimized code which will run on O(N)?
Use a Set
. For each item first check the set, if its there remove it and the item, else add the item to the set and move to the next item. When done you should have one item remaining in the set, that will be the odd one out.
function findOdd(arr)
const found = new Set();
while (arr.length > 0)
const val = arr.pop(); // or use shift
// if val in found remove it from the set
if (found.has(val)) found.delete(val)
else found.add(val) // else add it to the set
return [...found.values()][0];
Elegant solution! Can you confirm the worst case space complexity of this? I think it is O(1) (not counting the storage required for input arguments) - correct me if I'm wrong.
â Anirban Bera
Jul 13 at 4:26
@AnirbanBera Sorry O(n) space for hash tables. See wiki en.wikipedia.org/wiki/Hash_table
â Blindman67
Jul 13 at 5:01
// if val in found remove it from the set
comment is useless.
â Stexxe
Jul 13 at 11:37
add a comment |Â
up vote
1
down vote
accepted
up vote
1
down vote
accepted
Any explanation why it shows exponential timing (I have not used any nested loops)?
Inside the while loop you have A.indexOf(pop);
which is the second inner loop. It iterates over each item until it finds the match. You can use a Set which uses a hash table to locate items.
Any suggestions on what would be the optimized code which will run on O(N)?
Use a Set
. For each item first check the set, if its there remove it and the item, else add the item to the set and move to the next item. When done you should have one item remaining in the set, that will be the odd one out.
function findOdd(arr)
const found = new Set();
while (arr.length > 0)
const val = arr.pop(); // or use shift
// if val in found remove it from the set
if (found.has(val)) found.delete(val)
else found.add(val) // else add it to the set
return [...found.values()][0];
Any explanation why it shows exponential timing (I have not used any nested loops)?
Inside the while loop you have A.indexOf(pop);
which is the second inner loop. It iterates over each item until it finds the match. You can use a Set which uses a hash table to locate items.
Any suggestions on what would be the optimized code which will run on O(N)?
Use a Set
. For each item first check the set, if its there remove it and the item, else add the item to the set and move to the next item. When done you should have one item remaining in the set, that will be the odd one out.
function findOdd(arr)
const found = new Set();
while (arr.length > 0)
const val = arr.pop(); // or use shift
// if val in found remove it from the set
if (found.has(val)) found.delete(val)
else found.add(val) // else add it to the set
return [...found.values()][0];
edited Jul 13 at 4:03
answered Jul 12 at 21:32
Blindman67
5,2381320
5,2381320
Elegant solution! Can you confirm the worst case space complexity of this? I think it is O(1) (not counting the storage required for input arguments) - correct me if I'm wrong.
â Anirban Bera
Jul 13 at 4:26
@AnirbanBera Sorry O(n) space for hash tables. See wiki en.wikipedia.org/wiki/Hash_table
â Blindman67
Jul 13 at 5:01
// if val in found remove it from the set
comment is useless.
â Stexxe
Jul 13 at 11:37
add a comment |Â
Elegant solution! Can you confirm the worst case space complexity of this? I think it is O(1) (not counting the storage required for input arguments) - correct me if I'm wrong.
â Anirban Bera
Jul 13 at 4:26
@AnirbanBera Sorry O(n) space for hash tables. See wiki en.wikipedia.org/wiki/Hash_table
â Blindman67
Jul 13 at 5:01
// if val in found remove it from the set
comment is useless.
â Stexxe
Jul 13 at 11:37
Elegant solution! Can you confirm the worst case space complexity of this? I think it is O(1) (not counting the storage required for input arguments) - correct me if I'm wrong.
â Anirban Bera
Jul 13 at 4:26
Elegant solution! Can you confirm the worst case space complexity of this? I think it is O(1) (not counting the storage required for input arguments) - correct me if I'm wrong.
â Anirban Bera
Jul 13 at 4:26
@AnirbanBera Sorry O(n) space for hash tables. See wiki en.wikipedia.org/wiki/Hash_table
â Blindman67
Jul 13 at 5:01
@AnirbanBera Sorry O(n) space for hash tables. See wiki en.wikipedia.org/wiki/Hash_table
â Blindman67
Jul 13 at 5:01
// if val in found remove it from the set
comment is useless.â Stexxe
Jul 13 at 11:37
// if val in found remove it from the set
comment is useless.â Stexxe
Jul 13 at 11:37
add a comment |Â
up vote
0
down vote
The solution with an O(N) time complexity with O(1) space is a little bit hacky. The solution is to xor each number together. some important properties of xor are:
- xor of two identical numbers is zero.
- xor of any number and zero is the number.
- xor is commutative.
- xor is associative.
example:
A = [9, 3, 9, 3, 9, 7, 9]
the solution to this example is:
(((((9^3)^9)^3)^9)^7)^9
= 9^3^9^3^9^7^9 (4)
= 9^9^9^9^3^3^7 (3)
= (9^9)^(9^9)^(3^3)^7 (3)
= 0^0^0^7 (1)
= 7 (2)
add a comment |Â
up vote
0
down vote
The solution with an O(N) time complexity with O(1) space is a little bit hacky. The solution is to xor each number together. some important properties of xor are:
- xor of two identical numbers is zero.
- xor of any number and zero is the number.
- xor is commutative.
- xor is associative.
example:
A = [9, 3, 9, 3, 9, 7, 9]
the solution to this example is:
(((((9^3)^9)^3)^9)^7)^9
= 9^3^9^3^9^7^9 (4)
= 9^9^9^9^3^3^7 (3)
= (9^9)^(9^9)^(3^3)^7 (3)
= 0^0^0^7 (1)
= 7 (2)
add a comment |Â
up vote
0
down vote
up vote
0
down vote
The solution with an O(N) time complexity with O(1) space is a little bit hacky. The solution is to xor each number together. some important properties of xor are:
- xor of two identical numbers is zero.
- xor of any number and zero is the number.
- xor is commutative.
- xor is associative.
example:
A = [9, 3, 9, 3, 9, 7, 9]
the solution to this example is:
(((((9^3)^9)^3)^9)^7)^9
= 9^3^9^3^9^7^9 (4)
= 9^9^9^9^3^3^7 (3)
= (9^9)^(9^9)^(3^3)^7 (3)
= 0^0^0^7 (1)
= 7 (2)
The solution with an O(N) time complexity with O(1) space is a little bit hacky. The solution is to xor each number together. some important properties of xor are:
- xor of two identical numbers is zero.
- xor of any number and zero is the number.
- xor is commutative.
- xor is associative.
example:
A = [9, 3, 9, 3, 9, 7, 9]
the solution to this example is:
(((((9^3)^9)^3)^9)^7)^9
= 9^3^9^3^9^7^9 (4)
= 9^9^9^9^3^3^7 (3)
= (9^9)^(9^9)^(3^3)^7 (3)
= 0^0^0^7 (1)
= 7 (2)
edited Jul 13 at 3:52
answered Jul 12 at 21:49
Peter
59410
59410
add a comment |Â
add a comment |Â
up vote
0
down vote
We can find unpaired number by sorting array of integers and searching for one, which has no adjacent with same value.
My suggested solution:
const nextIsDifferent = (el, index, arr) => ((index + 1) % 2 === 1 && el !== arr[index + 1]);
const findUnpaired = (arr) => arr.sort().find(nextIsDifferent);
console.log(findUnpaired([9, 3, 9, 3, 9, 7, 9]));
You have supplied an alternative solution, without saying how or why it is better. If you could add some details, this would make a nice answer.
â Graipher
Jul 13 at 12:33
This is also a nice solution. Can you please elaborate on the time complexity of it? will it be O(N) or O(NlogN) <for sorting>?
â Anirban Bera
Jul 13 at 15:58
I think it's O(NlogN)
â Stexxe
Jul 13 at 20:41
add a comment |Â
up vote
0
down vote
We can find unpaired number by sorting array of integers and searching for one, which has no adjacent with same value.
My suggested solution:
const nextIsDifferent = (el, index, arr) => ((index + 1) % 2 === 1 && el !== arr[index + 1]);
const findUnpaired = (arr) => arr.sort().find(nextIsDifferent);
console.log(findUnpaired([9, 3, 9, 3, 9, 7, 9]));
You have supplied an alternative solution, without saying how or why it is better. If you could add some details, this would make a nice answer.
â Graipher
Jul 13 at 12:33
This is also a nice solution. Can you please elaborate on the time complexity of it? will it be O(N) or O(NlogN) <for sorting>?
â Anirban Bera
Jul 13 at 15:58
I think it's O(NlogN)
â Stexxe
Jul 13 at 20:41
add a comment |Â
up vote
0
down vote
up vote
0
down vote
We can find unpaired number by sorting array of integers and searching for one, which has no adjacent with same value.
My suggested solution:
const nextIsDifferent = (el, index, arr) => ((index + 1) % 2 === 1 && el !== arr[index + 1]);
const findUnpaired = (arr) => arr.sort().find(nextIsDifferent);
console.log(findUnpaired([9, 3, 9, 3, 9, 7, 9]));
We can find unpaired number by sorting array of integers and searching for one, which has no adjacent with same value.
My suggested solution:
const nextIsDifferent = (el, index, arr) => ((index + 1) % 2 === 1 && el !== arr[index + 1]);
const findUnpaired = (arr) => arr.sort().find(nextIsDifferent);
console.log(findUnpaired([9, 3, 9, 3, 9, 7, 9]));
edited Jul 13 at 12:49
answered Jul 13 at 12:08
Stexxe
3067
3067
You have supplied an alternative solution, without saying how or why it is better. If you could add some details, this would make a nice answer.
â Graipher
Jul 13 at 12:33
This is also a nice solution. Can you please elaborate on the time complexity of it? will it be O(N) or O(NlogN) <for sorting>?
â Anirban Bera
Jul 13 at 15:58
I think it's O(NlogN)
â Stexxe
Jul 13 at 20:41
add a comment |Â
You have supplied an alternative solution, without saying how or why it is better. If you could add some details, this would make a nice answer.
â Graipher
Jul 13 at 12:33
This is also a nice solution. Can you please elaborate on the time complexity of it? will it be O(N) or O(NlogN) <for sorting>?
â Anirban Bera
Jul 13 at 15:58
I think it's O(NlogN)
â Stexxe
Jul 13 at 20:41
You have supplied an alternative solution, without saying how or why it is better. If you could add some details, this would make a nice answer.
â Graipher
Jul 13 at 12:33
You have supplied an alternative solution, without saying how or why it is better. If you could add some details, this would make a nice answer.
â Graipher
Jul 13 at 12:33
This is also a nice solution. Can you please elaborate on the time complexity of it? will it be O(N) or O(NlogN) <for sorting>?
â Anirban Bera
Jul 13 at 15:58
This is also a nice solution. Can you please elaborate on the time complexity of it? will it be O(N) or O(NlogN) <for sorting>?
â Anirban Bera
Jul 13 at 15:58
I think it's O(NlogN)
â Stexxe
Jul 13 at 20:41
I think it's O(NlogN)
â Stexxe
Jul 13 at 20:41
add a comment |Â
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f198388%2ffind-value-that-occurs-in-odd-number-of-elements%23new-answer', 'question_page');
);
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password