0
点赞
收藏
分享

微信扫一扫

为了转行程序员而努力的第十九天

科牛 2022-01-09 阅读 44

今天又被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;
    }
}
  1. 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 --;
        }
    }
}
    1. 反转字符串中的元音字母
      给你一个字符串 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只有放到明天了,总是觉得空余时间太少了,要保持充足的睡眠时间,锻炼身体保持身体健康,一边全职上班一边刷题消耗还是比较大的,明天持续更新。

举报

相关推荐

0 条评论