一 LC9.回文数
题目要求:
给你一个整数
x
,如果x
是一个回文整数,返回true
;否则,返回false
。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
- 例如,
121
是回文,而123
不是。
思路分析:
本题难度整体不大,我们可以尝试用多种角度思考解题。
思路1:将数字转换成数组,数组头尾进行比较/数组逆序两个数组进行比较
思路2:转换成字符串,字符串前后进行比较
思路3:转换成字符串,逆序字符串,比较两个字符串是否相等
完整代码示例:
// 数字转换为字符串,双指针获取前后位比较是否相同
public boolean isPalindrome(int x) {
boolean flag = true;
String str = Integer.toString(x); // int转换为String
int i = 0;
int j = str.length() - 1;
while(i <= j ) {
if(str.charAt(i) == str.charAt(j)) {
i++;
j--;
} else {
return false;
}
}
return flag;
}
// 数字转换为字符串,反转字符串,比较两个字符串是否相同
public boolean isPalindrome(int x) {
String str1 = Integer.toString(x);
String str2 = new StringBuffer(str1).reverse().toString();
if(str1.equals(str2)) {
return true;
}
return false;
}
//数字转换为字符串再转化为数组,比较数组两端对应值是否相等
public boolean isPalindrome(int x) {
String str = Integer.toString(x);
char res[] = str.toCharArray(); // 字符串转换为字符数组
int i = 0;
int j = res.length -1;
while(i <= j) {
if(res[i] == res[j]) {
i++;
j--;
} else {
return false;
}
}
return true;
}
二 LC2210.统计数组中峰和谷的数量
题目要求:
给你一个下标从 0 开始的整数数组
nums
。如果两侧距i
最近的不相等邻居的值均小于nums[i]
,则下标i
是nums
中,某个峰的一部分。类似地,如果两侧距i
最近的不相等邻居的值均大于nums[i]
,则下标i
是nums
中某个谷的一部分。对于相邻下标i
和j
,如果nums[i] == nums[j]
, 则认为这两下标属于 同一个 峰或谷。注意,要使某个下标所做峰或谷的一部分,那么它左右两侧必须 都 存在不相等邻居。
返回
nums
中峰和谷的数量。
思路分析:
最开始的想法是指针遍历,分别比较它与它左、右值的大小是否相同,对特殊值特殊处理(类似递归但是现在反应过来好像递归错了....后来考虑可以预处理数组,参考移除元素的题目,去除数组中连续重复元素,得到一个不含连续重复的数组,直接使用新数组对比连续三个值。
完整代码示例:
class Solution {
public int countHillValley(int[] nums) {
int count = 0;
int slow = 0;
int fast = 1;
for(fast=1;fast<nums.length;fast++) {
if(nums[fast] != nums[slow]) {
nums[slow+1] =nums[fast];
slow++;
}
}
int flag = 1;
while(flag < slow) {
if(nums[flag] > nums[flag - 1] && nums[flag] > nums[flag + 1]) {
count++;
}else if(nums[flag] < nums[flag - 1] && nums[flag] < nums[flag + 1]) {
count++;
}
flag++;
}
return count;
}
}
搬运其他的题解,感觉这个思路很绝!
public int countHillValley(int[] nums) {
int statue=0,n=0;//状态和计数
for(int i=1;i<nums.length;i++)//遍历一遍数组
{
if(nums[i-1]<nums[i])//现在上升
{
if(statue==-1) //之前下降
++n; //是谷
statue=1; //更改之前状态
}
else if(nums[i-1]>nums[i])//现在下降
{
if(statue==1) //之前上升
++n; //是峰
statue=-1; //更改之前状态
}
}
return n;
}
三 LC2824.统计和小于目标的下标对数目
题目要求:
给你一个下标从 0 开始长度为
n
的整数数组nums
和一个整数target
,请你返回满足0 <= i < j < n
且nums[i] + nums[j] < target
的下标对(i, j)
的数目。
思路分析:
使用滑动窗口,定义两个指针,slow从头遍历到尾,fast从slow+1开始遍历到尾,计算arr[slow] + arr[fast]的值,若小于target,则计数器加1,重点关注临界值即可
完整代码示例:
lass Solution {
public int countPairs(List<Integer> nums, int target) {
int fast = 0;
int slow = 0;
int count = 0;
while(slow < nums.size() - 1) {
for(fast = slow +1; fast < nums.size(); fast++) {
if(nums.get(slow) + nums.get(fast) < target) {
count++;
}
}
slow++;
}
return count;
}
}