最容易理解的java数组位移(献给我的第一次博客)

这是我的 第一个 博客,所以很多东西都不是很明白,希望看到的大牛们不要太介意。

前段时间,即使校招的时候,有个电话面试,要求我写出一个数组位移的算法。我本身就没怎么学算法和数据结构,所以。。。。最后还是写出来了。但是是一个很垃圾的代码。考官先说,空间复杂度高,然后苦逼的我就改代码,然后考官有说,时间复杂度高。然后苦逼的我又想。因为是电话面试,事件也是有限,这个题就过了。今天看算法的时候,脑袋突然灵光一闪。想到了自己觉得还算可以的算法。

然后 这段时间也在博客上逛,就觉得自己也应该写个博客与人分享。还能得到大牛的指点。

so,我就写了我人生中的第一个博客,名为《java的数组位移》。

~\(≧▽≦)/~

回归正题。

1.首先,看图说明一下,怎么想到的

  最容易理解的java数组位移(献给我的第一次博客)_第1张图片

这是一个数组length=5 的一个数组。我现在想实现全部位移1位,成为:

实现思路:
最容易理解的java数组位移(献给我的第一次博客)_第2张图片
可以看到,只要保持第一个不变,循环的交换就可以实现。时间复杂度只是n,这只是个过度,为了引出下面的问题,而且实现代码很简单,我就不写上了。

//数组移位
	public static void yiwei1(int []a){
		for(int i=1;i

 算了,还是粘上吧,可以比较一下。 
  
现在,有这么个需求,我想移动两位怎么办?
很简单,上面的代码,执行一次是移动一位,那我只要让他循环两次就可以了
//数组移位
	public static void yiwei1(int []a,int n){
		n=2;//循环两次
		while(n>0){
			for(int i=1;i

那这样是完成了,你们可以试一下,就是n=100也是好使的。如果不考虑其他因素,例如效率,时间复杂度或者空间复杂度等因素的话,上面的方法是可以满足需求的。
但是
如果真的只会写到这的话,你的老师看到,一定会狠狠地骂你,或者面试的时候,面试官也会鄙视你的(例如我╮(╯_╰)╭)。

可以想到 如果位移5位,这个数组会变成什么样子?
大家说的对,会恢复原样。
位移10次,位移100次,1000次(我们的代码是实际位移几次,最外层的循环就循环了几次)。
哇塞!!!!!
我的电脑真是做了太多次的无用功了啊,如果是要位移100次的话,这个数组完全就不用动啊。
所以,
怎么办呢?
我们想想,什么情况下数组才要位移呢,
如果是N
看到这里,大家想到了什么呢?

大家说的对,可以想到取模。
N%=length
这样,我们得到的n总是小于数组的大小,及得到的n就是要做的最外层的循环while的次数。
上代码
//数组移位
	public static void yiwei1(int []a,int n){
		n%=a.length;//这里对位移做一下处理,可以保证最外层的循环不超过数组的大小
		while(n>0){
			for(int i=1;i

到这里,这个就算完成了。

下面的算法有问题,我给删了,有时间整理一下。





你可能感兴趣的:(算法)