LeetCode區間合併、字符串操作高頻題(四)

我是方圓
無它,唯手熟爾

56. 合併區間

在這裏插入圖片描述

class Solution {
    public int[][] merge(int[][] intervals) {
        List<int[]> res = new ArrayList<>();
        if (intervals == null || intervals.length == 0)
            return res.toArray(new int[0][]);
		
		//對區間按左值排序
        Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
 
        int i = 0;
        while (i < intervals.length) {
            int left = intervals[i][0];
            int right = intervals[i][1];
            // i不能到最後一行,所以要小於(數組的長度 - 1)
            // 判斷所在行的right和下一行的left大小,對right重新進行賦最大值,之後再不斷進行while循環判斷
            while (i < intervals.length - 1 && right >= intervals[i + 1][0]) {
                i++;
                right = Math.max(right, intervals[i][1]);
            }
            res.add(new int[] { left, right });
            i++;
        }
        return res.toArray(new int[0][]);
    }
}

6. Z字形變換

在這裏插入圖片描述

class Solution {
    public String convert(String s, int numRows) {
        if(numRows == 1)
            return s;
        
        int len = Math.min(s.length(), numRows);
        String []rows = new String[len];
        for(int i = 0; i< len; i++) rows[i] = "";
        
        int loc = 0;
        boolean down = false;

        for(int i=0;i<s.length();i++) {
        	//截取一個字符串
            rows[loc] += s.substring(i,i+1);
            //轉換方向
            if(loc == 0 || loc == numRows - 1)
                down = !down;
            loc += down ? 1 : -1;
        }
        
        String ans = "";
        for(String row : rows) {
            ans += row;
        }
        return ans;
    }
}

14. 最長公共前綴

在這裏插入圖片描述

class Solution {
    public String longestCommonPrefix(String[] strs) {
        if(strs.length == 0)
            return "";

        String ans = strs[0];

        for(int i = 1; i < strs.length;i++){
            int j = 0;
            for(;j < strs[i].length() && j < ans.length();j++){
                if(strs[i].charAt(j) != ans.charAt(j))
                    break;
            }
            ans = ans.substring(0,j);
            if(ans.equals(""))
                return "";
        }
        return ans;
    }
}

736. 劃分字母區間

在這裏插入圖片描述

class Solution {
    public List<Integer> partitionLabels(String s) {
        int[] last = new int[26];

        //找出每個字母最後出現的位置
        for(int i = 0;i < s.length();i++)
            last[s.charAt(i) - 'a'] = i;

        int j = 0; //尾
        int anchor = 0; //首

        List<Integer> ans = new ArrayList<>();
        for(int i = 0;i < s.length();i++){
            j = Math.max(j,last[s.charAt(i) - 'a']);

            if(i == j){
                ans.add(j - anchor + 1);
                anchor = i + 1;
            }
        }
        return ans;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章