测试开发备战秋招面试17-牛客刷题之双指针

努力了那么多年,回头一望,几乎全是漫长的挫折和煎熬。对于大多数人的一生来说,顺风顺水只是偶尔,挫折、不堪、焦虑和迷茫才是主旋律。我们登上并非我们所选择的舞台,演出并非我们所选择的剧本。继续加油吧!

目录

1、合并两个有序的数组

2、 判断是否为回文字符串

3、反转字符串

4、最长无重复子数组

5、合并区间

6、盛水最多的容器

7、接雨水问题


1、合并两个有序的数组

题目链接:合并两个有序的数组_牛客题霸_牛客网

思路:这题可以用双指针,我直接全部存list里,然后排序,方便。

Java版:

import java.util.*;
public class Solution {
    public void merge(int A[], int m, int B[], int n) {
        List<Integer> list = new ArrayList<>() ;
        
        for(int i=0; i<m; i++){
            list.add(A[i]) ;
        }
        for(int y : B){
            list.add(y) ;
        }
        Collections.sort(list) ;
        for(int i=0; i<m+n; i++){
            A[i] = list.get(i) ;
        }
        
    }
}

2、 判断是否为回文字符串

题目链接:判断是否为回文字符串_牛客题霸_牛客网

思路:定义双指针遍历比对即可。

Java版:

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param str string字符串 待判断的字符串
     * @return bool布尔型
     */
    public boolean judge (String str) {
        // write code here
        int low = 0, high = str.length() - 1 ;
        while(low<high){
            if(str.charAt(low) != str.charAt(high)){
                return false ;
            }
            low ++ ;
            high -- ;
        }
        return true ;
    }
}

3、反转字符串

题目链接:反转字符串_牛客题霸_牛客网

思路:一行代码调api反转即可,没必要双指针。
Java版:

import java.util.*;


public class Solution {
    /**
     * 反转字符串
     * @param str string字符串 
     * @return string字符串
     */
    public String solve (String str) {
        // write code here
        return new StringBuilder(str).reverse().toString() ;
    }
}

4、最长无重复子数组

题目链接:最长无重复子数组_牛客题霸_牛客网

思路:借助队列实现,一层循环,如果不存在则入队,存在,弹出直至后不包含该元素再入队。

Java版:
 

import java.util.*;


public class Solution {
    /**
     *
     * @param arr int整型一维数组 the array
     * @return int整型
     */
    public int maxLength (int[] arr) {
        // write code here
       
        int max = 0 ;

        Queue<Integer> queue = new LinkedList<>() ;
        for(int ans : arr){
            if(!queue.contains(ans)){
                queue.add(ans) ;
            }else{
                while(queue.contains(ans)){
                    queue.poll() ;
                }
                queue.add(ans) ;
            }

            max = max <= queue.size() ? queue.size() : max ;
        }
    return max ;
        
    }
}

5、合并区间

题目链接:合并区间_牛客题霸_牛客网
思路:首先按区间进行排序,排序完成之后,在依次判断有交集的合并,无交集的直接加入集合。
Java版:

import java.util.*;
/**
 * Definition for an interval.
 * public class Interval {
 *     int start;
 *     int end;
 *     Interval() { start = 0; end = 0; }
 *     Interval(int s, int e) { start = s; end = e; }
 * }
 */
public class Solution {
    public static ArrayList<Interval> merge(ArrayList<Interval> intervals) {
        if (intervals.size() == 0) {
            return new ArrayList<>() ;
        }
        ArrayList<Interval> list = new ArrayList<>() ;
        Collections.sort(intervals, new Comparator<Interval>() {
            public int compare(Interval o1, Interval o2) {
                if (o1.start != o2.start)
                    return o1.start - o2.start;
                else
                    return o1.end - o2.end;
            }
        });
        list.add(intervals.get(0)) ;
        for (int i = 1; i < intervals.size(); i++) {
            int l1 = list.get(list.size() - 1).start ;
            int r1 = list.get(list.size() - 1).end ;
            int l2 = intervals.get(i).start ;
            int r2 = intervals.get(i).end ;
            if (l2 >= l1 && l2 <= r1) {
                list.remove(list.size() - 1) ;
                list.add(new Interval(l1, Math.max(r1, r2))) ;
            } else if (l1 >= l2 && l1 <= r2) {
                list.remove(list.size() - 1) ;
                list.add(new Interval(l2, Math.max(r1, r2))) ;
            } else {
                    list.add(intervals.get(i));
            }
        }
        return list ;
    }
}

6、盛水最多的容器

题目链接:盛水最多的容器_牛客题霸_牛客网

思路:从两边向中间遍历,枚举找出最大的容器即可,每次小的边往中间移动。

Java版:

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param height int整型一维数组 
     * @return int整型
     */
    public int maxArea (int[] height) {
        // write code here
        if(height.length<=1){
            return 0 ;
        }
        int left = 0, right = height.length - 1 ;
        int max = 0 ;
        while(left<right){
            int tmp = (right - left) * Math.min(height[left], height[right]) ;
            max = Math.max(max, tmp) ;
            if(height[left] >= height[right]){
                right -- ;
            }else{
                left ++ ;
            }
        }
        return max ;
    }
}

7、接雨水问题

题目链接:接雨水问题_牛客题霸_牛客网

思路:从两边向中间依次累加,记录左右边界的最大值,每次累加水洼值即可。

Java版:

import java.util.*;


public class Solution {
    /**
     * max water
     * @param arr int整型一维数组 the array
     * @return long长整型
     */
    public long maxWater (int[] arr) {
        // write code here
        int left = 0, right = arr.length - 1 ;
        int ml = 0, mr = 0 ;
        int ans = 0 ;
        while(left < right){
            ml = Math.max(ml, arr[left]) ;
            mr = Math.max(mr, arr[right]) ;
            if(ml<mr){
                ans += ml - arr[left++] ;
            }else{
                ans += mr - arr[right--] ;
            }
        }
        return ans ;
    }
}

猜你喜欢

转载自blog.csdn.net/nuist_NJUPT/article/details/131159414