> 文章列表 > 283. 移动零|||189. 轮转数组|||396. 旋转函数

283. 移动零|||189. 轮转数组|||396. 旋转函数

283. 移动零|||189. 轮转数组|||396. 旋转函数

283. 移动零

题目

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

代码

class Solution {public void moveZeroes(int[] nums) {int i=0,j=0;for(i=0;i<nums.length;i++){        if(nums[i]!=0)nums[j++]=nums[i];}while(j<nums.length)nums[j++]=0;}
}

思考

我想到了双指针的方法,交换0和非0的位置,但是我循环的是慢指针,然后处理不好在哪里停止训练(快指针到达尾部的时候,可是我[0],[0,0]的情况真不知道咋搞)
看了眼别人洗的,就这么短短几行完美解决,我还是得继续努力啊。

189. 轮转数组

题目

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

代码

class Solution {public void rotate(int[] nums, int k) {k %= nums.length;reverse(nums,0,nums.length-1);reverse(nums,0,k-1);reverse(nums,k,nums.length-1);}public void reverse(int[] nums,int start,int end){while(start<=end){int temp=nums[start];nums[start]=nums[end];nums[end]=temp;start++;end--;}}
}

思考

我想到了反转的方法。整个思路是有的。
代码问题:1 我把自定义的反转函数写在了rotate里面(不知道是不是python写多了的原因)2 没有想到这个k可以大于数组长度(应该先求余的)

396. 旋转函数

题目

给定一个长度为 n 的整数数组 nums 。

假设 arrk 是数组 nums 顺时针旋转 k 个位置后的数组,我们定义 nums 的 旋转函数 F 为:

F(k) = 0 * arrk[0] + 1 * arrk[1] + … + (n - 1) * arrk[n - 1]
返回 F(0), F(1), …, F(n-1)中的最大值 。

代码

class Solution {public int maxRotateFunction(int[] nums) {int sum=0,f=0;for(int i=0;i<nums.length;i++){f+=i*nums[i];sum+=nums[i];}int maxnum=f;for(int i=1;i<nums.length;i++){f=f+sum-nums.length*nums[nums.length-i];maxnum=Math.max(maxnum,f);}return maxnum;}
}

思考

看见题目,只能想到暴力。然而懒惰的我还不想写暴力,就直接去看题解了。
果然啊,这得数学功底了得啊,错位相减法(⊙o⊙)…
得找规律