力扣打卡day08——轮转数组、除自身外乘积

189. 轮转数组 - 力扣(LeetCode)

思路

输入: nums = 1,2,3,4,5,6,7, k = 3

输出: 5,6,7,1,2,3,4

解释:

当k 等于nums.length时,数组没变,所以要取模

1,2,3,4,5,6,7\] 反转一次 \[7,6,5,4,3,2,1

对前k 个反转

5,6,7,4,3,2,1

对剩下的反转

5,6,7, 1,2,3,4

复制代码
class Solution {
    public void rotate(int[] nums, int k) {
        //这个就是反转三次就行
        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 tmp=nums[start];
            nums[start]=nums[end];
            nums[end]=tmp;
            start++;
            end--;
        }
    }
}

238. 除了自身以外数组的乘积 - 力扣(LeetCode)

第一个循环使用数组ans\[\]来存储每个元素左侧元素乘积(从最左侧开始,每次往右乘一个数)。

第二个循环不使用数组存储值,直接使用一个变量temp计算右侧元素乘积(从最右侧元素开始,每次往左乘一个数)。然后直接用ans\[\]*temp来计算最终结果,每一轮计算出temp就计算使用掉然后下一轮更新。

最终就只用到两个单层循环和一个数组。

原数组: 1 2 3 4

左部分的乘积: 1 1 1*2 1*2*3

右部分的乘积: 2*3*4 3*4 4 1

结果: 1*2*3*4 1*3*4 1*2*4 1*2*3*1

复制代码
class Solution {
    public int[] productExceptSelf(int[] nums) {
        int n=nums.length;
        if(n==0) return nums;
        int ans[]=new int[n];
        int tmp=1;
        ans[0]=1;
        //计算左边的乘积
        for(int i=1;i<n;i++){
            ans[i]=ans[i-1]*nums[i-1];
        }
        //计算右边的乘积
        for(int i=n-2;i>=0;i--){
            tmp*=nums[i+1];
            ans[i]*=tmp;
        }
        return ans;
    }
}
相关推荐
JieE2121 天前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
Jack201 天前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
小小杨树1 天前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色
JieE2122 天前
LeetCode 226. 翻转二叉树|JS 递归超详细拆解,二叉树入门经典题
javascript·算法
JieE2122 天前
LeetCode 104. 二叉树的最大深度|递归思路超详细拆解
javascript·算法
vivo互联网技术2 天前
CVPR 2026 | 全新强化学习框架 BeautyGRPO:重塑真实人像
算法·大模型·cvpr·影像
Darling噜啦啦2 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
用户497863050732 天前
(一)小红的数组操作
算法·编程语言
怕浪猫2 天前
Electron 系列文章封面图
算法·架构·前端框架