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

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;
}

Open in new window






I am not passing all tests by failing edge cases
Expected      Run            
shiftLeft([6, 2, 5, 3]) → [2, 5, 3, 6]      Exception:java.lang.ArrayIndexOutOfBoundsException: -1 (line number:5)      X      
shiftLeft([1, 2]) → [2, 1]      Exception:java.lang.ArrayIndexOutOfBoundsException: -1 (line number:5)      X      
shiftLeft([1]) → [1]      Exception:java.lang.ArrayIndexOutOfBoundsException: -1 (line number:5)      X      
shiftLeft([]) → []      []      OK      
shiftLeft([1, 1, 2, 2, 4]) → [1, 2, 2, 4, 1]      Exception:java.lang.ArrayIndexOutOfBoundsException: -1 (line number:5)      X      
shiftLeft([1, 1, 1]) → [1, 1, 1]      Exception:java.lang.ArrayIndexOutOfBoundsException: -1 (line number:5)      X      
shiftLeft([1, 2, 3]) → [2, 3, 1]      Exception:java.lang.ArrayIndexOutOfBoundsException: -1 (line number:5)      X      
other tests
X      
Your progress graph for this problem


How to improve my design, approach, code? please advise
LVL 7
gudii9Asked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

 
CPColinSenior Java ArchitectCommented:
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.
0
 
gudii9Author Commented:
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
0
 
CPColinSenior Java ArchitectCommented:
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?
0
Ultimate Tool Kit for Technology Solution Provider

Broken down into practical pointers and step-by-step instructions, the IT Service Excellence Tool Kit delivers expert advice for technology solution providers. Get your free copy now.

 
gudii9Author Commented:
as
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;
}

Open in new window

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
0
 
gudii9Author Commented:
i thought edge case something happen at start and end of array
0
 
CPColinSenior Java ArchitectCommented:
You could maybe argue for that definition, depending on the problem.

In the case of this problem, I would consider the edge cases to be determined based on the size of the array. One edge case would be when you pass in an empty array (which is one of the tests) and another would be when you pass in a very large array.

It's not really important what you call it, though, as long as you know where to focus your attention. It looks like you've got everything but the last element sorted out!
0

Experts Exchange Solution brought to you by ConnectWise

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
 
gudii9Author Commented:
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;
		}
 
}

Open in new window

0
 
gudii9Author Commented:
		  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;
		

Open in new window


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.ArrayIndexOutOfBoundsException: 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
0
 
gudii9Author Commented:
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;
		}

Open in new window


above passing all tests. please advise any improvements/modifications
0
 
CPColinSenior Java ArchitectCommented:
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!
0
 
gudii9Author Commented:
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
how to do without creating new array?
not clear? please advise
0
 
CPColinSenior Java ArchitectCommented:
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.
0
 
gudii9Author Commented:
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;
}

Open in new window



but i created new array right in above comment code?
0
 
CPColinSenior Java ArchitectCommented:
So you did. My mistake. Just skip the line where you create a new array.
0
 
gudii9Author Commented:
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;
}

Open in new window


if i skip compilation error at assignment statement

 arr[i]=nums[i+1];

Open in new window

0
 
CPColinSenior Java ArchitectCommented:
Well yeah, you need to update that line to use the right array on both sides of the = sign.
0
 
gudii9Author Commented:
how to use right array on both sides if i have only one array and i am not creating new array? confusing
0
 
CPColinSenior Java ArchitectCommented:
Try it and see what happens.
0
 
gudii9Author Commented:
Right means opposite of left
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;
}

Open in new window


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;
}

Open in new window

how to fix that index out of bound for empty array?
0
 
gudii9Author Commented:
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;



}

Open in new window


i fixed as above. any improvements?
0
 
CPColinSenior Java ArchitectCommented:
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.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.