真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Day08字符串-創(chuàng)新互聯(lián)

Day08 字符串
  • 一、344. 反轉(zhuǎn)字符串
  • 二、541. 反轉(zhuǎn)字符串II
  • 三、劍指 Offer 05. 替換空格
  • 四、151.翻轉(zhuǎn)字符串里的單詞
  • 五、劍指Offer58-II.左旋轉(zhuǎn)字符串

專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)靈璧免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了成百上千企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
一、344. 反轉(zhuǎn)字符串
class Solution {public void reverseString(char[] s) {int left = 0;
        int right = s.length - 1;
        while(left< right){s[left] ^= s[right];
            s[right] ^= s[left]; 
            s[left] ^= s[right];
            left++;
            right--;
        }
    }
}

此題使用雙向指針即可,無難度;
關(guān)鍵:此題使用了異或運(yùn)算,異或可以代替三角交換,需要熟悉。

二、541. 反轉(zhuǎn)字符串II
class Solution {public String reverseStr(String s, int k) {char[] ch = s.toCharArray();
        for(int i = 0; i< ch.length; i += 2 * k){int start = i;
            int end = Math.min(i + k - 1,ch.length - 1);
            while(start< end){ch[start] ^= ch[end];
                ch[end] ^= ch[start];
                ch[start] ^= ch[end];
                start++;
                end--;
            }
        }
        return new String(ch);
    }
}

此題與上一題類似,區(qū)別在于只翻轉(zhuǎn)部分的字符串,對(duì)其進(jìn)行變量控制即可。

三、劍指 Offer 05. 替換空格
class Solution {//使用一個(gè)新的對(duì)象,復(fù)制 str,復(fù)制的過程對(duì)其判斷,是空格則替換,否則直接復(fù)制,類似于數(shù)組復(fù)制
	public static String replaceSpace(String s) {if (s == null) {return null;
        }
        //選用 StringBuilder 單線程使用,比較快,選不選都行
        StringBuilder sb = new StringBuilder();
        //使用 sb 逐個(gè)復(fù)制 s ,碰到空格則替換,否則直接復(fù)制
        for (int i = 0; i< s.length(); i++) {//s.charAt(i) 為 char 類型,為了比較需要將其轉(zhuǎn)為和 " " 相同的字符串類型
            //if (" ".equals(String.valueOf(s.charAt(i)))){}
            if (s.charAt(i) == ' ') {sb.append("%20");
            } else {sb.append(s.charAt(i));
            }
        }
        return sb.toString();
    }

	//方式二:雙指針法
    public String replaceSpace(String s) {if(s == null || s.length() == 0){return s;
        }
        StringBuffer sb = new StringBuffer();
        for(int i = 0;i< s.length(); i++){if(s.charAt(i) == ' '){sb.append("  ");
            }
        }
        //若是沒有空格直接返回
        if(sb.length() == 0){return s;
        }
        int left = s.length() - 1;
        s += sb.toString();
        int right = s.length() - 1;
        char[] ch = s.toCharArray();
        while(left>=0){if(ch[left] == ' '){ch[right--] = '0';
                ch[right--] = '2';
                ch[right] = '%';  
            }else{ch[right] = ch[left];
            } 
            left--;
            right--;
        }
        return new String(ch);
    }
}

此題有兩種解法:
解法一:new一個(gè)StringBuilder(),判斷是否為空格進(jìn)行追加就行,無難度
解法二:遍歷數(shù)組得出有多少空格,算出數(shù)組的大小,從后往前填充數(shù)組;從后往前遍歷數(shù)組是該算法的關(guān)鍵

四、151.翻轉(zhuǎn)字符串里的單詞
class Solution {public String reverseWords(String s) {// 1.去除首尾以及中間多余空格
        StringBuilder sb = removeSpace(s);
        // 2.反轉(zhuǎn)整個(gè)字符串
        reverseString(sb, 0, sb.length() - 1);
        // 3.反轉(zhuǎn)各個(gè)單詞
        reverseEachWord(sb);
        return sb.toString();
        
    }

     private StringBuilder removeSpace(String s) {int start = 0;
        int end = s.length() - 1;
        //去除開頭的空格
        while (s.charAt(start) == ' ') start++;
        //去除末尾的空格
        while (s.charAt(end) == ' ') end--;
        StringBuilder sb = new StringBuilder();
        //去除中間空格
        while (start<= end) {char c = s.charAt(start);
            //如果是空格就跳過(這里需要保留第一個(gè)空格所以需要||后面的那個(gè)條件存在)
            if (c != ' ' || sb.charAt(sb.length() - 1) != ' ') {sb.append(c);
            }
            start++;
        }
        
        return sb;
    }
    //翻轉(zhuǎn)字符串,使用方法setCharAt();
    public void reverseString(StringBuilder sb, int start, int end) {while (start< end) {char temp = sb.charAt(start);
            sb.setCharAt(start, sb.charAt(end));
            sb.setCharAt(end, temp);
            start++;
            end--;
        }
    }
    
    private void reverseEachWord(StringBuilder sb) {int start = 0;
        int end = 1;
        int n = sb.length();
        while (start< n) {//首先找到第一個(gè)單詞后面的空格,然后翻轉(zhuǎn)單詞
            while (end< n && sb.charAt(end) != ' ') {end++;
            }
            reverseString(sb, start, end - 1);
            start = end + 1;
            end = start + 1;
        }
    }
}

此題的思路是:先翻轉(zhuǎn)整個(gè)字符串,再翻轉(zhuǎn)單個(gè)單詞。具體看代碼內(nèi)的注釋。

五、劍指Offer58-II.左旋轉(zhuǎn)字符串
class Solution {public String reverseLeftWords(String s, int n) {int len=s.length();
        StringBuilder sb=new StringBuilder(s);
        reverseString(sb,0,n-1);
        reverseString(sb,n,len-1);
        return sb.reverse().toString();
    }
    public void reverseString(StringBuilder sb, int start, int end) {while (start< end) {char temp = sb.charAt(start);
            sb.setCharAt(start, sb.charAt(end));
            sb.setCharAt(end, temp);
            start++;
            end--;
        }
    }
}

與上一題類似,使用局部翻轉(zhuǎn)加全局翻轉(zhuǎn)即可實(shí)現(xiàn)左旋字符串。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧


網(wǎng)頁標(biāo)題:Day08字符串-創(chuàng)新互聯(lián)
URL鏈接:http://weahome.cn/article/shcsh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部