0
点赞
收藏
分享

微信扫一扫

力扣-字符串

十里一走马 2022-01-05 阅读 104

一、字符串常用api

string类

函数说明
char charAt(int index)返回 char指定索引处的值。
boolean contains(CharSequence s)当且仅当此字符串包含指定的char值序列时才返回true。
boolean equals(Object anObject)将此字符串与指定对象进行比较
boolean isEmpty()返回 true如果,且仅当 length()为 0
int length()返回此字符串的长度
String replace(char oldChar, char newChar)返回从替换所有出现的导致一个字符串 oldChar在此字符串 newChar
char[] toCharArray()将此字符串转换为新的字符数组。
static String valueOf(char c)返回 char参数的字符串 char形式。
String[] split(String regex)将此字符串分割为给定的 regular expression的匹配。
static String join(CharSequence delimiter, Iterable<? extends CharSequence> elements)返回一个新 String的副本组成 CharSequence elements与指定的副本一起加入 delimiter 。

StringBuffer类
1、StringBuffer类主要增加了字符串的增删改查等操作
2、StringBuilder类为StringBuffer的子类,为单线程字符串缓存区,优点速度更快

函数说明
StringBuffer append(char c)将 char参数的字符串表示附加到此序列。
StringBuffer insert(int offset, char c)在此序列中插入 char参数的字符串表示形式。
StringBuffer reverse()导致该字符序列被序列的相反代替。
StringBuffer delete(int start, int end)删除此序列的子字符串中的字符。
int indexOf(String str)返回指定子字符串第一次出现的字符串内的索引。

二、翻转字符串里的单词

思路1:
很多语言对字符串提供了 split(拆分),reverse(翻转)和 join(连接)等方法,因此我们可以简单的调用内置的 API 完成操作:

使用 split 将字符串按空格分割成字符串数组;
使用 reverse 将字符串数组进行反转;
使用 join 方法将字符串数组拼成一个字符串。
代码:

class Solution {
    public String reverseWords(String s) {
        // 除去开头和末尾的空白字符
        s = s.trim();
        // 正则匹配连续的空白字符作为分隔符分割
        List<String> wordList = Arrays.asList(s.split("\\s+"));
        Collections.reverse(wordList);
        return String.join(" ", wordList);
    }
}

思路2:

1.去除首尾以及中间多余空格
2.反转整个字符串
3.反转各个单词

class Solution {
   /**
     * 1.去除首尾以及中间多余空格
     * 2.反转整个字符串
     * 3.反转各个单词
     */
    public String reverseWords(String s) {
    
        // 1.去除首尾以及中间多余空格
        StringBuilder sb = removeSpace(s);
        // 2.反转整个字符串
        reverseString(sb, 0, sb.length() - 1);
        // 3.反转各个单词
        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);
            //如果字符不为空,或者sb中存储的最后的一个字符不是空字符
            if (c != ' ' || sb.charAt(sb.length() - 1) != ' ') {
                sb.append(c);
            }
            start++;
        }
        return sb;
    }

    /**
     * 反转字符串指定区间[start, end]的字符
     */
    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) {
            while (end < n && sb.charAt(end) != ' ') {
                end++;
            }
            reverseString(sb, start, end - 1);
            start = end + 1;
            end = start + 1;
        }
    }
}
举报

相关推荐

0 条评论