开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情
刷题的日常-2022年11月27号
一天一题,保持脑子清爽
检查数组是否经排序和轮转得到
来自leetcode的 1752 题,题意如下:
给你一个数组 nums 。nums 的源数组中,所有元素与 nums 相同,但按非递减顺序排列。
如果 nums 能够由源数组轮转若干位置(包括 0 个位置)得到,则返回 true ;否则,返回 false 。 源数组中可能存在 重复项 。
注意:我们称数组 A 在轮转 x 个位置后得到长度相同的数组 B ,当它们满足 A[i] == B[(i+x) % A.length] ,其中 % 为取余运算。
理解题意
通过题意,我们可以将信息整理如下:
- 题目给出一个数组
- 要求我们对数组进行检查,如果数组能从某个位置开始,一直往后都是非递减的返回true
- 也就是说数组要能够按照某个顺序轮着走一圈不会出现递减的情况
做题思路
从题意理解,可能需要找出第一个递减的点,因为这里可能是拐点,如果出现多个拐点的话,那么就不符合要求。拐点只有一个,我们可以在遍历的过程中进行记录,还有不能只遍历一次数组里面的内容,需要再多循环一个,然后通过拐点来判断是否存在多个拐点,步骤如下:
- 开辟一个布尔值,遇到拐点进行记录
- 开辟一个变量记录上一个扫描的数据,另外开辟一个变量记录需要扫描的长度
- 这里需要扫描 数组长度 + 1
- 对当前位置去摸,如果当前值比前一个值大,并且已经出现过拐点,返回false
- 否则更新拐点字段 和 前一个值的记录
- 都能通过返回true
代码实现
代码实现如下:
public class Solution {
public boolean check(int... nums) {
boolean flip = false;
int pre = nums[0], idx, len = nums.length + 1;
for (int i = 0; i < len; i++) {
idx = i % nums.length;
if (flip && nums[idx] < pre) {
return false;
}
flip |= nums[idx] < pre;
pre = nums[idx];
}
return true;
}
}