gudii9
asked on
withoutTen challenge
Hi,
I am working on below challenge
http://codingbat.com/prob/p196976
My psuedo code of the logical approach is
1 loop through given array
2 check and see if all elements are not 10 if yes then return same array
3.if given element is 10 replace it with 0
4. display the array with all zeros at the front and non zero numbers at the end
I wrote my code as below
I am not passing all tests
How to improve my design, approach, code? please advise
I am working on below challenge
http://codingbat.com/prob/p196976
My psuedo code of the logical approach is
1 loop through given array
2 check and see if all elements are not 10 if yes then return same array
3.if given element is 10 replace it with 0
4. display the array with all zeros at the front and non zero numbers at the end
I wrote my code as below
public int[] withoutTen(int[] nums) {
int[] result=null;
for(int i=0;i<nums.length;i++){
if(nums[i]!=10){
result=nums;
}
else if(nums[i]==10){
nums[i]=0;
}
}
return result;
}
I am not passing all tests
Expected Run
withoutTen([1, 10, 10, 2]) → [1, 2, 0, 0] [1, 0, 0, 2] X
withoutTen([10, 2, 10]) → [2, 0, 0] [0, 2, 0] X
withoutTen([1, 99, 10]) → [1, 99, 0] [1, 99, 0] OK
withoutTen([10, 13, 10, 14]) → [13, 14, 0, 0] [0, 13, 0, 14] X
withoutTen([10, 13, 10, 14, 10]) → [13, 14, 0, 0, 0] [0, 13, 0, 14, 0] X
withoutTen([10, 10, 3]) → [3, 0, 0] [0, 0, 3] X
withoutTen([1]) → [1] [1] OK
withoutTen([13, 1]) → [13, 1] [13, 1] OK
withoutTen([10]) → [0] null X
withoutTen([]) → [] null X
other tests
X
How to improve my design, approach, code? please advise
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
OK
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
public int[] withoutTen(int[] nums) {
int[] result=null;
for(int i=0;i<nums.length;i++){
if(nums[i]!=10){
result=nums;
}
else if(nums[i]==10){
nums[i]=0;
}
}
//return result;
int len=nums.length;
int[] arr=new int[len];
int front=0;
int back=len-1;
for(int i=0;i<nums.length;i++){
if(nums[i]%2==1){
arr[front]=nums[i];
front++;
}
else if(nums[i]%2==0){
arr[back]=nums[i];
back--;
}
}
return arr;
}
Expected Run
withoutTen([1, 10, 10, 2]) → [1, 2, 0, 0] [1, 2, 0, 0] OK
withoutTen([10, 2, 10]) → [2, 0, 0] [0, 2, 0] X
withoutTen([1, 99, 10]) → [1, 99, 0] [1, 99, 0] OK
withoutTen([10, 13, 10, 14]) → [13, 14, 0, 0] [13, 14, 0, 0] OK
withoutTen([10, 13, 10, 14, 10]) → [13, 14, 0, 0, 0] [13, 0, 14, 0, 0] X
withoutTen([10, 10, 3]) → [3, 0, 0] [3, 0, 0] OK
withoutTen([1]) → [1] [1] OK
withoutTen([13, 1]) → [13, 1] [13, 1] OK
withoutTen([10]) → [0] [0] OK
withoutTen([]) → [] [] OK
other tests
X
i integrated my solution with evenodd challenge solution and failing couple of tests. how to fox them. please advise
Ok, working with the code that you have, first you should really take out the first loop that you have (lines 2 -> 12), because all that does is change any 10's to 0's. This sounds ok at first but the problem is that you would lose track of which 0's were real zero's and which were there because they were initially 10. Now there might not be any test case that would highlight that problem, but it is best to be sure.
Now, what your left with is a loop that copies odd numbers to the front of the array and copies even numbers to the back of the array.
But what you want (if using this code) is to copy non-10 numbers to the front of the array and puts a zero in for a 10 to the back of the array.
So, yes, there are similarities there and you can use the code that you have, but the changes required could be worked out with the bold words I have written above, ie. you have lines in your code that check if the number is odd or even (lines 21, 26), so you have to change those so that they check for non-10 and 10 numbers.
Also, the other difference in the bold numbers above is instead of copying the even (line 27) you have to put 0 in place of the 10.
Hopefully, with those hints above, you can change just the 3 lines of code required to get the code working properly.
Now, what your left with is a loop that copies odd numbers to the front of the array and copies even numbers to the back of the array.
But what you want (if using this code) is to copy non-10 numbers to the front of the array and puts a zero in for a 10 to the back of the array.
So, yes, there are similarities there and you can use the code that you have, but the changes required could be worked out with the bold words I have written above, ie. you have lines in your code that check if the number is odd or even (lines 21, 26), so you have to change those so that they check for non-10 and 10 numbers.
Also, the other difference in the bold numbers above is instead of copying the even (line 27) you have to put 0 in place of the 10.
Hopefully, with those hints above, you can change just the 3 lines of code required to get the code working properly.
ASKER
public int[] withoutTen(int[] nums) {
int len=nums.length;
int[] arr=new int[len];
int front=0;
int back=len-1;
for(int i=0;i<nums.length;i++){
if(nums[i]%10==1||nums[i]%10==2||nums[i]%10==3||nums[i]%10==4||nums[i]%10==5||nums[i]%10==6||nums[i]%10==7||nums[i]%10==8||nums[i]%10==9){
arr[front]=nums[i];
front++;
}
else {
arr[back]=nums[i];
back--;
}
if(arr[i]%10==0){
arr[i]=0;
}
}
return arr;
}
i modified and failing below two tests. please advise
Expected Run
withoutTen([1, 10, 10, 2]) → [1, 2, 0, 0] [1, 2, 0, 0] OK
withoutTen([10, 2, 10]) → [2, 0, 0] [2, 10, 0] X
withoutTen([1, 99, 10]) → [1, 99, 0] [1, 99, 0] OK
withoutTen([10, 13, 10, 14]) → [13, 14, 0, 0] [13, 14, 0, 0] OK
withoutTen([10, 13, 10, 14, 10]) → [13, 14, 0, 0, 0] [13, 14, 10, 0, 0] X
withoutTen([10, 10, 3]) → [3, 0, 0] [3, 0, 0] OK
withoutTen([1]) → [1] [1] OK
withoutTen([13, 1]) → [13, 1] [13, 1] OK
withoutTen([10]) → [0] [0] OK
withoutTen([]) → [] [] OK
other tests
OK
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
public int[] withoutTen(int[] nums) {
int len=nums.length;
int[] arr=new int[len];
int front=0;
int back=len-1;
for(int i=0;i<nums.length;i++){
if(nums[i]%10==1||nums[i]%10==2||nums[i]%10==3||nums[i]%10==4||nums[i]%10==5||nums[i]%10==6||nums[i]%10==7||nums[i]%10==8||nums[i]%10==9){
arr[front]=nums[i];
front++;
}
/* else {
arr[back]=nums[i];
back--;
}
if(arr[i]%10==0){
arr[i]=0;
}*/
}
return arr;
}
that passed all tests
Expected Run
withoutTen([1, 10, 10, 2]) → [1, 2, 0, 0] [1, 2, 0, 0] OK
withoutTen([10, 2, 10]) → [2, 0, 0] [2, 0, 0] OK
withoutTen([1, 99, 10]) → [1, 99, 0] [1, 99, 0] OK
withoutTen([10, 13, 10, 14]) → [13, 14, 0, 0] [13, 14, 0, 0] OK
withoutTen([10, 13, 10, 14, 10]) → [13, 14, 0, 0, 0] [13, 14, 0, 0, 0] OK
withoutTen([10, 10, 3]) → [3, 0, 0] [3, 0, 0] OK
withoutTen([1]) → [1] [1] OK
withoutTen([13, 1]) → [13, 1] [13, 1] OK
withoutTen([10]) → [0] [0] OK
withoutTen([]) → [] [] OK
other tests
OK
any imrovement or refinement to above code? otherwise will close it
This
if(nums[i]%10==1||nums[i]% 10==2||num s[i]%10==3 ||nums[i]% 10==4||num s[i]%10==5 ||nums[i]% 10==6||num s[i]%10==7 ||nums[i]% 10==8||num s[i]%10==9 )
can be shortened to
if nums[i] != 0
if(nums[i]%10==1||nums[i]%
can be shortened to
if nums[i] != 0
ASKER
you mean
above also passed all
nums[i]%10 != 0
right?above also passed all
public int[] withoutTen(int[] nums) {
int len=nums.length;
int[] arr=new int[len];
int front=0;
int back=len-1;
for(int i=0;i<nums.length;i++){
if(nums[i]%10 != 0){
arr[front]=nums[i];
front++;
}
/* else {
arr[back]=nums[i];
back--;
}
if(arr[i]%10==0){
arr[i]=0;
}*/
}
return arr;
}
you mean
1:nums[i]%10 != 0
Yes, that is exactly what I meant :-)
1:nums[i]%10 != 0
Yes, that is exactly what I meant :-)
if (nums[i]%10 != 0) {
The above is NOT what you want either. Since all the tests are passing there is obviously no test case for it, but if the input array had any 0, 20, 30, 40, 50, 60, ... etc. it would NOT do what you want it to do.
Just do this...
if (nums[i] != 10) {
ASKER