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⊙)…
得找规律