【LeetCode】1417. 重新格式化字串(Java)

angenin十一發表於2020-10-04

給你一個混合了數字和字母的字串 s,其中的字母均為小寫英文字母。

請你將該字串重新格式化,使得任意兩個相鄰字元的型別都不同。也就是說,字母后面應該跟著數字,而數字後面應該跟著字母。

請你返回 重新格式化後 的字串;如果無法按要求重新格式化,則返回一個 空字串 。

解法一

寫得不好,思路是把數字和字元分別存到list中,然後判斷兩個list的長度,長的做起始位,長出2個及以上返回"",然後迴圈拼接到StringBuilder裡。

class Solution {
    public String reformat(String s) {
        //把字串裡的數字和字元分別存放到對應的list中
        List<Character> nums = new ArrayList();
        List<Character> chars = new ArrayList();
        for (char c : s.toCharArray()) {
            if (c >= '0' && c <= '9')   nums.add(c);
            else    chars.add(c);
        }

        //判斷兩個list的個數
        //如果個數相差超過1個,那麼就不符合
        if (Math.abs(nums.size() - chars.size()) > 1)   return "";

        //判斷是數字多還是字元多,多的當起始位
        boolean startNum = nums.size() >= chars.size() ? true : false;
        StringBuilder sb = new StringBuilder();

        //拼接
        int x = 0, y = 0;
        while (x < nums.size() && y < chars.size()) {
            if (startNum) {
                sb.append(nums.get(x));
                sb.append(chars.get(y));    
            } else {
                sb.append(chars.get(y));
                sb.append(nums.get(x));
            }
            x++;    
            y++;
        }
        //因為迴圈是用&&,所以可能會有剩餘,判斷是否還有剩餘字元
        if (x != nums.size())   sb.append(nums.get(x));
        else if (y != chars.size())   sb.append(chars.get(y));

        return sb.toString();
    }
}

在這裡插入圖片描述
用到了兩個list,一個StringBuilder,空間用多了,直接步驟也過多,效率不行,解法二我直接複製過來,寫得挺厲害的,我在這裡卡了半天,中間因為邏輯出錯,又重新推到重來。

解法二

解法二是在題解區複製過來的。(作者:1905215165)
解法二的思路:先把所有字元存到陣列裡,然後遍歷得出,數字和字元的數量;然後判斷是哪個數量多,多的做起始位,如果其中數量比另一個多出2個及以上,就返回"";這裡和我步驟差不多,接下來就厲害了,使用增強for迴圈遍歷判斷是數字還是字元,然後放到原陣列裡,每次加2,這樣數字和字元就不會衝突,各自做各自的,這點省去了很多判斷。

class Solution {
    public String reformat(String s) {
        int num1=0,num2=0;
        char[] chars = s.toCharArray();
        for(char c:chars){
            if(c >= '0'&&c <= '9'){num1++;}
            else{num2++;}
        }//看數字字元比較多還是字母字元比較多
        if( num1-num2<-1 || num1-num2>1){return "";}
        if(num1>num2){
            num1 = 0;num2 = 1;
        }else{
            num1 = 1;num2 = 0;
        }
        for(char c:s.toCharArray()){
            if(c >= '0'&&c <= '9'){chars[num1] = c; num1 += 2;}
            else{chars[num2] = c; num2 += 2;}
        }
        return new String(chars);
    }
}

//作者:1905215165

在這裡插入圖片描述

相關文章