gudii9
asked on
ShiftLeft challenge
Hi,
I am working on below challenge
http://codingbat.com/prob/p105031
Psedo code description of approach :
1. create new array of given array lenght
2. assign each new array i th element with given array i-1 th element
3, return new array
I wrote my code as below
I am not passing all tests by failing edge cases
How to improve my design, approach, code? please advise
I am working on below challenge
http://codingbat.com/prob/p105031
Psedo code description of approach :
1. create new array of given array lenght
2. assign each new array i th element with given array i-1 th element
3, return new array
I wrote my code as below
public int[] shiftLeft(int[] nums) {
int len =nums.length;
int[] arr=new int[len];
for(int i=0;i<len;i++){
arr[i]=nums[i-1];
}
return arr;
}
I am not passing all tests by failing edge cases
Expected Run
shiftLeft([6, 2, 5, 3]) → [2, 5, 3, 6] Exception:java.lang.ArrayIndexOutOfB oundsExcep tion: -1 (line number:5) X
shiftLeft([1, 2]) → [2, 1] Exception:java.lang.ArrayIndexOutOfB oundsExcep tion: -1 (line number:5) X
shiftLeft([1]) → [1] Exception:java.lang.ArrayIndexOutOfB oundsExcep tion: -1 (line number:5) X
shiftLeft([]) → [] [] OK
shiftLeft([1, 1, 2, 2, 4]) → [1, 2, 2, 4, 1] Exception:java.lang.ArrayIndexOutOfB oundsExcep tion: -1 (line number:5) X
shiftLeft([1, 1, 1]) → [1, 1, 1] Exception:java.lang.ArrayIndexOutOfB oundsExcep tion: -1 (line number:5) X
shiftLeft([1, 2, 3]) → [2, 3, 1] Exception:java.lang.ArrayIndexOutOfB oundsExcep tion: -1 (line number:5) X
other tests
X
Your progress graph for this problem
How to improve my design, approach, code? please advise
What do you think is causing the exception you're seeing? They're all the same, so it must be something that's happening commonly.
ASKER
Edge case again as i am checking i-1. if i start for loop at 1 to avoid this issue then i have to separately handle i at 0 indexed element which is bit challenging
The definition of "edge case" normally refers to situations that happen very rarely and cause your code to fail. In this case, since you're failing almost every test the same way, the problem is, by definition, not an "edge case."
Terminology aside, what do you think is causing these exceptions? What in your code is making them happen?
Terminology aside, what do you think is causing these exceptions? What in your code is making them happen?
ASKER
as
need to fix last element
public int[] shiftLeft(int[] nums) {
int len =nums.length;
int[] arr=new int[len];
// arr[len]=nums[0];
for(int i=0;i<len-1;i++){
arr[i]=nums[i+1];
}
return arr;
}
Expected Run
shiftLeft([6, 2, 5, 3]) → [2, 5, 3, 6] [2, 5, 3, 0] X
shiftLeft([1, 2]) → [2, 1] [2, 0] X
shiftLeft([1]) → [1] [0] X
shiftLeft([]) → [] [] OK
shiftLeft([1, 1, 2, 2, 4]) → [1, 2, 2, 4, 1] [1, 2, 2, 4, 0] X
shiftLeft([1, 1, 1]) → [1, 1, 1] [1, 1, 0] X
shiftLeft([1, 2, 3]) → [2, 3, 1] [2, 3, 0] X
other tests
X
need to fix last element
ASKER
i thought edge case something happen at start and end of array
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
took erasable slate board with erasable marker and also opened eclipse to debug these two are most effective tools for me. i wil solve soon
public class shiftLeft {
public static void main(String[] args) {
int[] ar={6, 2, 5, 3};
System.out.println("is=="+shiftLeft(ar));
}
public static int[] shiftLeft(int[] nums) {
int len =nums.length;
int[] arr=new int[len];
// arr[len]=nums[0];
for(int i=0;i<len-1;i++){
arr[i]=nums[i+1];
}
return arr;
}
}
ASKER
int len =nums.length;
int[] arr=new int[len];
// arr[len]=nums[0];
for(int i=0;i<len-1;i++){
arr[i]=nums[i+1];
}
arr[len-1]=nums[0];
return arr;
all tests successful except one
Expected Run
shiftLeft([6, 2, 5, 3]) → [2, 5, 3, 6] [2, 5, 3, 6] OK
shiftLeft([1, 2]) → [2, 1] [2, 1] OK
shiftLeft([1]) → [1] [1] OK
shiftLeft([]) → [] Exception:java.lang.ArrayIndexOutOfB oundsExcep tion: 0 (line number:9) X
shiftLeft([1, 1, 2, 2, 4]) → [1, 2, 2, 4, 1] [1, 2, 2, 4, 1] OK
shiftLeft([1, 1, 1]) → [1, 1, 1] [1, 1, 1] OK
shiftLeft([1, 2, 3]) → [2, 3, 1] [2, 3, 1] OK
other tests
OK
let me fix that also
ASKER
public int[] shiftLeft(int[] nums) {
int len =nums.length;
int[] arr=new int[len];
// arr[len]=nums[0];
if(len>0){
for(int i=0;i<len-1;i++){
arr[i]=nums[i+1];
}
arr[len-1]=nums[0];
}else{
return arr;
}
return arr;
}
above passing all tests. please advise any improvements/modifications
That looks good to me. If you want to do it without creating a separate array, you could store nums[0] in a variable before you do the looping, then stick it at the end after the looping is done. But since the challenge says you can do it either way, this will work fine!
ASKER
If you want to do it without creating a separate array, you could store nums[0] in a variable before you do the looping, then stick it at the end after the looping is donehow to do without creating new array?
not clear? please advise
The code you have in this comment is very close to what you would need. All you have to do is store the first element somewhere before you start looping and put it at the end after your loop finishes.
ASKER
The code you have in this comment is very close to what you would need. All you have to do is store the first element somewhere before you start looping and put it at the end after your loop finishes.
public int[] shiftLeft(int[] nums) {
int len =nums.length;
int[] arr=new int[len];
// arr[len]=nums[0];
for(int i=0;i<len-1;i++){
arr[i]=nums[i+1];
}
return arr;
}
but i created new array right in above comment code?
So you did. My mistake. Just skip the line where you create a new array.
ASKER
public int[] shiftLeft(int[] nums) {
int len =nums.length;
// int[] arr=new int[len];
// arr[len]=nums[0];
for(int i=0;i<len-1;i++){
arr[i]=nums[i+1];
}
return arr;
}
if i skip compilation error at assignment statement
arr[i]=nums[i+1];
Well yeah, you need to update that line to use the right array on both sides of the = sign.
ASKER
how to use right array on both sides if i have only one array and i am not creating new array? confusing
Try it and see what happens.
ASKER
Right means opposite of left
i thought right means opposite of incorrect.
above passes all tests except one fails
i thought right means opposite of incorrect.
public int[] shiftLeft(int[] nums) {
int len =nums.length;
// int[] arr=new int[len];
int x=nums[0];
for(int i=0;i<len-1;i++){
nums[i]=nums[i+1];
}
nums[len-1]=x;
return nums;
}
above passes all tests except one fails
public int[] shiftLeft(int[] nums) {
int len =nums.length;
// int[] arr=new int[len];
int x=nums[0];
for(int i=0;i<len-1;i++){
nums[i]=nums[i+1];
}
nums[len-1]=x;
return nums;
}
how to fix that index out of bound for empty array?
ASKER
public int[] shiftLeft(int[] nums) {
int len =nums.length;
// int[] arr=new int[len];
if(len>0){
int x=nums[0];
for(int i=0;i<len-1;i++){
nums[i]=nums[i+1];
}
nums[len-1]=x;
return nums;
}
else
return nums;
}
i fixed as above. any improvements?
Right means opposite of left
i thought right means opposite of incorrect.
In this case, it meant both!
i fixed as above. any improvements?
Looks good to me! Glad you solved the problem with the empty array.