训练营练习-Day8&字符串1

Leetcode 344 力扣

解法:双指针使用temp交换位置

public static char[] reverseString(char[] s) {
    int left = 0 ;
    int right = s.length -1;
    while (right >left){
        char temp = s[left];
        s[left] = s[right];
        s[right] = temp;
        left++;
        right--;
    }
    return s;
}

Leetcode 541 力扣

解法:双指针+循环遍历2k步长

public static String reverseStr(String s, int k) {
    char[] chars = s.toCharArray();
    for (int i = 0; i < chars.length; i+=2*k) {
        if (i+k <= chars.length){
            reverse(chars,i,i+k-1);// 左闭右开区间
            continue; // 跳出本次循环
        }
        reverse(chars,i ,chars.length-1);
    }
    return new String(chars);
}

private static void reverse(char[] chars, int i, int j) {
    while (i < j){
        char temp = chars[i];
        chars[i] = chars[j];
        chars[j] = temp;
        i++;
        j--;
    }
}

Leetcode 剑指 Offer 05. 替换空格 力扣

解法:库函数replace

public static String replaceSpace(String s) { // 需要使用枚举方式和双指针方式加练
    return s.replace(" ", "%20");
}
public static String reverseWords(String s) {
    char[] chars = s.toCharArray();
    //1.去除首尾以及中间多余空格
    chars = removeExtraSpaces(chars);
    //2.整个字符串反转
    reverse(chars, 0, chars.length - 1);
    //3.单词反转
    reverseEachWord(chars);
    return new String(chars);
}

private static void reverseEachWord(char[] chars) {
    int start = 0;
    //end <= s.length() 这里的 = ,是为了让 end 永远指向单词末尾后一个位置,这样 reverse 的实参更好设置
    for (int end = 0; end <= chars.length; end++) {
        // end 每次到单词末尾后的空格或串尾,开始反转单词
        if (end == chars.length || chars[end] == ' ') {
            reverse(chars, start, end - 1);  // 左闭右开区间
            start = end + 1; // 下个单词反转起始位置加上单词间空格1
        }
    }
}

private static void reverse(char[] chars, int i, int j) {
    while (i < j){
        char temp = chars[i];
        chars[i] = chars[j];
        chars[j] = temp;
        i++;
        j--;
    }
}

private static char[] removeExtraSpaces(char[] chars) {
    int slow = 0;
    for (int fast = 0; fast < chars.length; fast++) {
        //先用 fast 移除所有空格,获取字母元素
        if (chars[fast] != ' ') {
            //在用 slow 加空格。 除第一个单词外slow位置不为0,单词末尾要加空格
            if (slow != 0)
                chars[slow++] = ' ';
            //fast 小于长度且fast获取到为元素,将fast值存到slow下标的位置
            while (fast < chars.length && chars[fast] != ' ')
                chars[slow++] = chars[fast++];
        }
    }
    // slow位置记录单词位置
    char[] newChars = new char[slow];
    // 数组拷贝
    System.arraycopy(chars, 0, newChars, 0, slow);
    return newChars;
}

Leetcode 剑指 Offer 58 - II. 左旋转字符串 力扣

解法:使用额外字符串空间。需要使用双指针解法练习

public static String reverseLeftWords(String s, int n) {
    String substring1 = s.substring(0, n);
    String substring2 = s.substring(n);
    StringBuilder builder = new StringBuilder();
    builder.append(substring2).append(substring1);
    return builder.toString();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值