数组排序旋转校验代码异常:输入{2,1,3,4}返回结果不符
旋转数组校验代码逻辑问题排查
给定代码用于校验输入数组是否由某一排序数组经过若干次旋转(包括0次)得到,但输入{2,1,3,4}时返回true,实际正确结果应为false,以下是逻辑问题排查:
原代码
class Solution { public int [] rotate(int [] arr, int k){ int [] ans = new int[arr.length]; for(int i=0;i<arr.length;i++){ ans[i]=arr[(i+k)%arr.length]; } return ans; } public boolean check(int[] nums){ int count=0; boolean b=false; for(int i=0;i<nums.length-1;i++){ if(nums[i]<nums[i+1]){ b=true;; } } int [] temp = new int[nums.length]; for(int i=1;i<nums.length;i++){ temp=rotate(temp,i); for(int k=0;k<nums.length-1;k++){ if(temp[k]<temp[k+1]){ b=true; } } } if(b==true){ return true; } return false; } }
核心问题点
- 初始判断逻辑完全错误:第一个循环只要发现任意一对相邻元素递增就将
b设为true,这和校验目标完全无关。比如输入{2,1,3,4}中存在3<4,直接触发b=true,后续逻辑直接返回true,完全忽略了数组不符合旋转排序数组的事实。 - rotate方法旋转逻辑错误:当前的索引计算
ans[i]=arr[(i+k)%arr.length]无法正确生成旋转后的数组。比如要实现右移k次,正确的逻辑应该是将原数组的第i位放到新数组的(i+k)%arr.length位置,而非反过来。 - 临时数组初始化无效:
temp被初始化为全0数组,后续对全0数组旋转并比较,完全没有用到输入的nums数组,这部分逻辑完全是无效操作。 - 整体校验思路错误:不需要生成所有可能的旋转数组再判断是否有序,旋转排序数组的核心特征是:数组中相邻元素递减的次数最多为1次(包括最后一个元素和第一个元素的比较)。如果递减次数超过1次,说明无法由排序数组旋转得到。
修正后的代码示例
class Solution { public boolean check(int[] nums) { int decreaseCount = 0; int n = nums.length; for (int i = 0; i < n; i++) { // 比较当前元素和下一个元素,最后一个元素和第一个元素比较 if (nums[i] > nums[(i + 1) % n]) { decreaseCount++; // 递减次数超过1次,直接返回false if (decreaseCount > 1) { return false; } } } return true; } }
内容的提问来源于stack exchange,提问作者user_program
相关产品推荐
相关产品推荐

