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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值