( Java 和 C++ 还是有差别)卑微地向API低下了头,但是反转字符串的单词依旧写了很久 学会( 151. 反转字符串中的单词 ) 两个剑指就像小儿科

344.反转字符串 - ez

class Solution {
    public void reverseString(char[] s) {
        int left = 0, right = s.length - 1;
        char tmp;
        while (left < right) {
            tmp = s[left];
            s[left] = s[right];
            s[right] = tmp;
            right--;
            left++;
        }
    }
}

541. 反转字符串II

1、 画图去分析,会很容易找到end的取值
2、把 i++ 变成 i+= 2*k 是一个很重要的思路进步 -

class Solution {
    public String reverseStr(String s, int k) {
        char[] str = s.toCharArray();
        for (int i = 0; i < s.length(); i += 2 * k) {
            int start = i;
            int end;
            end = i + k - 1 > s.length() - 1 ? s.length() - 1 : i + k - 1;
            // ⬆⬆⬆⬆⬆⬆   IDEA自动优化成Math.min(i + k - 1, s.length() - 1)
            char tmp;
            while (start < end) {
                tmp = str[start];
                str[start] = str[end];
                str[end] = tmp;
                start++;
                end--;
            }
        }
        return new String(str);
    }
}

151.翻转字符串里的单词

1、思路很重要 ( 先去空格 -> 反转字符串 -> 反转字符串的单词 )
2、还就内个找 end 找了很久。

/********************************/
    /**
     * <a href="https://leetcode.cn/problems/reverse-words-in-a-string/">151. 反转字符串中的单词</a><BR>
     * 给你一个字符串 s ,请你反转字符串中 单词 的顺序。<BR>
     */
    public String reverseWords(String s) {
        StringBuilder sb = new StringBuilder();
        sb = removeSpace(s);
        reverseEachWord(sb);
        reverse(sb, 0, sb.length() - 1);
        return sb.toString();

    }

    private StringBuilder removeSpace(String s) {
        StringBuilder sb = new StringBuilder();
        int start = 0, end = s.length() - 1;
        while (s.charAt(start) == ' ') start++;
        while (s.charAt(end) == ' ') end--;
        while (start <= end) {
            if (s.charAt(start) != ' ' || sb.charAt(sb.length() - 1) != ' ') {
                sb.append(s.charAt(start));
            }
            start++;
        }
        return sb;
    }

    private void reverse(StringBuilder sb, int start, int end) {
        char tmp;
        while (start < end) {
            tmp = sb.charAt(start);
            sb.setCharAt(start, sb.charAt(end));
            sb.setCharAt(end, tmp);
            start++;
            end--;
        }
    }

    private void reverseEachWord(StringBuilder sb) {
        int start = 0, end = start + 1;
        while (end < sb.length()) {
            while (end < sb.length() && sb.charAt(end) != ' ') {
                end++;
            }
            reverse(sb, start, end - 1);
            // end其实是通过start去定位的,能用函数映射关系找数字,就不要用脑袋去找
            start = end + 1;
            end = start + 1;
        }
    }

/**************************************************/

剑指Offer 05.替换空格 【经历151题的我,这个不要太ez】

【省流: ez 但是 API战士】

class Solution {
    public String replaceSpace(String s) {
    StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == ' ') {
                sb.append("%20");
            } else {
                sb.append(s.charAt(i));
            }
        }
        return sb.toString();
    }
}

剑指Offer58-II.左旋转字符串 【那就更ez了】

【谢谢 java提供的面向对象方法
【学过c语言,感觉面向过程会复杂一点,我也不确定】

class Solution {
    public String reverseLeftWords(String s, int n) {
            return s.substring(n) + s.substring(0,n);
	}
}
posted @ 2022-12-03 21:33  维萨斯  阅读(19)  评论(0)    收藏  举报