今天又被oncall了,虽然事情简单,但是处理人的情绪真的是很影响心情。调整好负面情绪,静下心来听课刷题,今天讲双指针,相对来说思路和实现都比较简单。
学习笔记:
1.167. 两数之和 II - 输入有序数组
给定一个已按照 非递减顺序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。
函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。
你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。
解题思路:非常经典的twosum题,暴力解法是使用双重遍历,时间复杂度为O(N^2),也可以使用二分搜索,时间复杂度为O(log N)。主要介绍的是使用双指针,一头一尾两个指针,如果和大于target,右指针减去1,小于target,左指针加上1.时间复杂度为O(N)
class Solution {
public int[] twoSum(int[] numbers, int target) {
int[] result = new int[2];
int left = 0;
int right = numbers.length-1;
while(left < right){
if ((numbers[left]+numbers[right]) == target){
result[0] = left+1;
result[1] = right+1;
break;
}
else if ((numbers[left]+numbers[right])>target){
right--;
}
else if ((numbers[left]+numbers[right])<target){
left++;
}
}
return result;
}
}
- leetcode125 验证回文串
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
解题思路:使用左右两个指针,分别从头和尾开始遍历字符串,如果遇到特殊字符就跳过,转换大小写,比较字母是否相同,如果两个指针重合字母都相同,说明是回文串,否则不是
class Solution {
public boolean isPalindrome(String s) {
int left = 0;
int right = s.length()-1;
while(left<right){
while((left<right) && (!Character.isLetterOrDigit(s.charAt(left)))){
left++;
}
while((left<right) && (!Character.isLetterOrDigit(s.charAt(right)))){
right--;
}
if((left<right) && (Character.toLowerCase(s.charAt(left)) != Character.toLowerCase(s.charAt(right)))){
return false;
}
else{
left++;
right--;
}
}
return true;
}
}
3.344. 反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
解题思路:设置一头一尾两个指针,分别开始遍历,当left<right的时候,交换两个指针指向的元素值就可以了。
class Solution {
public void reverseString(char[] s) {
int left = 0;
int right = s.length-1;
while(left < right){
char tmp;
tmp = s[left];
s[left] = s[right];
s[right] = tmp;
left ++;
right --;
}
}
}
-
- 反转字符串中的元音字母
给你一个字符串 s ,仅反转字符串中的所有元音字母,并返回结果字符串。
元音字母包括 ‘a’、‘e’、‘i’、‘o’、‘u’,且可能以大小写两种形式出现。
- 反转字符串中的元音字母
解题思路:将String转换成char[]格式,设置左右两个指针,分别开始遍历,判断是否为元音字母,如果是就交换两个位置的值,遍历结束之后再创建一个新的String,将char[]的值赋给它
class Solution {
public String reverseVowels(String s) {
int left = 0;
int right = s.length()-1;
char[] result = s.toCharArray();
while(left < right){
while((left<right)&&(result[left]!='a' && result[left]!='e' && result[left]!='i' && result[left]!='o' && result[left]!='u' && result[left]!='A'&& result[left]!='E' && result[left]!='I'&& result[left]!='O'&& result[left]!='U')){
left ++;
}
while((left<right)&&(result[right]!='a' && result[right]!='e' && result[right]!='i' && result[right]!='o' && result[right]!='u' && result[right]!='A'&& result[right]!='E' && result[right]!='I'&& result[right]!='O'&& result[right]!='U')){
right --;
}
if( left<right ){
char tmp;
tmp = result[left];
result[left] = result[right];
result[right] = tmp;
left ++;
right --;
}
}
String sr = String.valueOf(result);
return sr;
}
}
今天双指针相对比较简单,多刷了一道题,还有一道思考题11只有放到明天了,总是觉得空余时间太少了,要保持充足的睡眠时间,锻炼身体保持身体健康,一边全职上班一边刷题消耗还是比较大的,明天持续更新。