普通数组-189. 轮转数组
文章目录一、核心解题思路二、完整可运行代码大厂机考版三、本题必须掌握的方法与知识点面试 / 机考常问1. 取模运算 k % n2. 双指针反转法 reverse3. Java 数组特点4. 为什么推荐三次反转力扣地址 中等189. 轮转数组挺简单的一、核心解题思路这道题的最优解法是三次反转法核心逻辑如下先反转整个数组反转前k个元素反转剩余的n-k个元素。该方法时间复杂度为 O(n)、空间复杂度为 O(1)满足题目进阶要求不使用额外空间。classSolution{publicvoidrotate(int[]nums,intk){k%nums.length;reverse(nums,0,nums.length-1);reverse(nums,0,k-1);reverse(nums,k,nums.length-1);}publicvoidreverse(int[]nums,intleft,intright){while(leftright){inttempnums[left];nums[left]nums[right];nums[right]temp;left;right--;}}}二、完整可运行代码大厂机考版importjava.util.Scanner;publicclassMain{// 核心方法轮转数组publicstaticvoidrotate(int[]nums,intk){// 处理 k 超过数组长度的情况取模优化k%nums.length;// 1. 反转整个数组reverse(nums,0,nums.length-1);// 2. 反转前 k 个元素reverse(nums,0,k-1);// 3. 反转剩余的 n-k 个元素reverse(nums,k,nums.length-1);}// 辅助方法反转数组指定区间 [left, right]privatestaticvoidreverse(int[]nums,intleft,intright){while(leftright){// 交换左右指针元素inttempnums[left];nums[left]nums[right];nums[right]temp;left;right--;}}publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);// 输入格式第一行输入数组长度第二行输入数组元素intnsc.nextInt();int[]numsnewint[n];for(inti0;in;i){nums[i]sc.nextInt();}// 输入轮转位数 kintksc.nextInt();// 调用方法rotate(nums,k);// 输出结果for(intnum:nums){System.out.print(num );}}}三、本题必须掌握的方法与知识点面试 / 机考常问1. 取模运算k % n作用处理k大于数组长度的情况例子数组长度 7k10 → 10%73等价于只轮转 3 次不写会超时 / 答案错误2. 双指针反转法reverse用两个指针left和right往中间靠拢每次交换指针指向的元素空间复杂度 O (1)原地修改最优解3. Java 数组特点Java 没有自带数组反转库函数必须自己写数组是引用类型方法内修改会直接改变原数组4. 为什么推荐三次反转不新建数组 → 省空间一遍遍历完成 → 速度最快面试 / 机考标准最优解