反转字符串

给定一个字符串 s 和一个整数 k,从字符串开头算起,每 2k 个字符反转前 k 个字符。

如果剩余字符少于 k 个,则将剩余字符全部反转。 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

示例 1:

输入:s = "abcdefg", k = 2
输出:"bacdfeg"
复制代码

示例 2:

输入:s = "abcd", k = 2
输出:"bacd"
复制代码

  • 思路:双指针
char[] chars;

public String reverseStr(String s, int k) {
    int n = s.length();
    chars = s.toCharArray();
    StringBuilder res = new StringBuilder();
    int l = 0, r = l + k;
    while (r < n) {
        res.append(reverse(s, l, r));
        res.append(s, r, Math.min(r + k, n));
        l += 2 * k;
        r = l + k;
    }
    if (l < n) {
        res.append(reverse(s, l, n));
    }

    return res.toString();
}

public String reverse(String s, int l, int r) {
    StringBuilder sb = new StringBuilder();
    for (int i = r - 1; i >= l; i--) {
        sb.append(chars[i]);
    }
    return sb.toString();
}
复制代码

2.编写一个函数,以字符串作为输入,反转该字符串中的元音字母。

示例 1:

 输入:"hello"
输出:"holle"
复制代码

示例 2:

 输入:"leetcode"
输出:"leotcede" 
复制代码

提示:

  • 元音字母不包含字母 "y" 。

思路:双指针

  • 双指针 l,r 分别指向左右第一个元音字母的索引
  • 跳出条件是l指向的索引是否小于r指向的索引
  • 每遍历到一个元音字母
    • 交换 l r
    • l 右移至下一个元音字母索引位置
    • r 左移至下一个原因字母索引位置
  • 因为java语言限制,String类型不可变,无法直接修改字符串
  • 所以空间上需要选择charArray这种类似的数据结构做交换
  • 定义寻址函数findl findr
  • 定义交换函数swap
  • 定义check函数判断是否是原因字母check
  • 第一次提交忘记了大小写的问题
public String reverseVowels(String s) {
    char[] res = s.toCharArray();
    int l = findl(res, 0), r = findr(res, s.length() - 1);
    while (l < r) {
        swap(res, l, r);
        l = findl(res, l + 1);
        r = findr(res, r - 1);
    }
    return String.valueOf(res);
}

public int findl(char[] chars, int l) {
    while (l < chars.length) {
        if (check(chars[l])) {
            return l;
        }
        l++;
    }
    return l;
}

public int findr(char[] chars, int r) {
    while (r >= 0) {
        if (check(chars[r])) {
            return r;
        }
        r--;
    }
    return r;
}

public void swap(char[] chars, int l, int r) {
    char temp = chars[l];
    chars[l] = chars[r];
    chars[r] = temp;
}

public boolean check(char c) {
       //大小写
        //元音字母只有这五个a,e,i,o,u
    c = Character.toLowerCase(c);
    return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u';
}

 

描述

写出一个程序,接受一个字符串,然后输出该字符串反转后的字符串。(字符串长度不超过1000)

示例1

输入:

"abcd"

复制返回值:

"dcba"

1,使用StringBuilder

使用StringBuilder,一行代码搞定

1

2

3

public String solve(String str) {

    return new StringBuilder(str).reverse().toString();

}

2,双指针

把字符串转化为数组,使用两个指针,一个在最前面一个在最后面,两个指针指向的值相互交换,交换完之后两个指针在分别往中间走……,重复上面的过程,直到两指针相遇为止

1

2

3

4

5

6

7

8

9

10

11

12

13

public String solve(String str) {

    char[] chars = str.toCharArray();

    int left = 0;

    int right = str.length() - 1;

    while (left < right) {

        char temp = chars[left];

        chars[left] = chars[right];

        chars[right] = temp;

        left++;

        right--;

    }

    return new String(chars);

}

3,使用一个指针

使用一个指针,从后往前不断的把字符串的字符放到一个数组中,最后再把数组转化为字符串

1

2

3

4

5

6

7

public String solve(String str) {

    char[] chars = str.toCharArray();

    int length = str.length();

    for (int i = 0; i < length; i++)

        chars[i] = str.charAt(length - 1 - i);

    return new String(chars);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值