力扣打卡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;
    }
}
相关推荐
奋发向前wcx1 小时前
y1,y2总复习笔记5 2026.7.19
数据结构·笔记·算法
战族狼魂4 小时前
高频面试题精选:分治与AI Agent架构
人工智能·算法·大模型·大语言模型
李剑一5 小时前
你用过网易的将军令嘛?它底层实现账号保护的原理相当简单粗暴
算法
Scott9999HH5 小时前
告别流量波动玄学!从法拉第电磁定律到底层 C/C++ 流量累积算法,深度解密工业级电磁流量计选型与开发
c语言·c++·算法
中达瑞和-高光谱·多光谱5 小时前
1nm到8nm光谱分辨率,你的应用该选哪款光谱相机?
算法·高光谱·高光谱相机
ChaoZiLL6 小时前
我的数据结构4-栈和队列
数据结构
香辣牛肉饭6 小时前
【算法】动态规划 最长公共子序列(LCS)
经验分享·笔记·算法·动态规划
miller-tsunami6 小时前
顺序表相关知识点
数据结构·顺序表
旖-旎6 小时前
LeetCode 279:完全平方数(完全背包)—— 题解
c++·算法·leetcode·动态规划·背包问题