请实现下面这个题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,不能申请额外的空间。

可以用双指针的方法来实现:

① 定义两个指针 i 和 j ,初始化为字符串的首尾位置;

② 当 i < j 时,依次对比字符串 i 和 j 位置的字符

  • 若 i 位置是小写字母,i 指针加 1;
  • 若 j 位置是大写字母,j 指针减 1;
  • 若 i 位置是大写字母,j 位置是小写字母,则交换两个位置的字符,并将 i 和 j 指针分别加 1 和 减 1 ;
  • 否则,i 和 j 分别加 1 和 减 1 

③ 当 i >= j 时,完成字符串的处理。

代码实现如下:

public static String moveUpperCase(String str) {
    if(str == null || str.length() <= 1){
        return str;
    }
    char[] chars = str.toCharArray();
    int i = 0, j = str.length() - 1;
    while (i < j) {
        if (Character.isLowerCase(chars[i])) {
            i++;
        } else if (Character.isUpperCase(chars[j])) {
            j--;
        } else if (Character.isUpperCase(chars[i]) && Character.isLowerCase(chars[j])) {
            char temp = chars[i];
            chars[i++] = chars[j];
            chars[j--] = temp;
        } else {
            i++;
            j--;
        }
    }
    return new String(chars);
}

        在这个方法中,首先判断输入字符串是否为空或者长度为 1,如果满足这些条件则直接返回原始字符串,否则进入双指针处理的 while 循环,直到 i >= j 时退出循环。其中,Character.isLowerCase() 和 Character.isUpperCase() 方法分别用于判断字符是否为小写字母和大写字母。

        在上述代码中,str.toCharArray() 方法将输入的字符串 str 按照字符分割成了一个字符数组 char[],之后我们对字符数组进行操作实现字符串的处理,最后再将字符数组转换为字符串返回。需要注意的是,在这个过程中,输入的原始字符串并没有变化。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值