面试笔试题--字符移位

题目

小Q最近遇到了一个难题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间。
你能帮帮小Q吗?

输入描述

输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.

输出描述

对于每组数据,输出移位后的字符串。

输入例子

AkleBiCeilD

输出例子

kleieilABCD

思路

从str的尾端开始,找到第一个大写字母,如果右边有小写字母,则冒泡到尾端大写字母为止

代码

package com.whu.fly.nowcoder;
import java.util.*;
/**算法基础-字符移位
 * 1.从str的尾端开始,找到第一个大写字母,冒泡到尾端大写字母为止,
 * 2.输出str
 */
public class MoveCharacter {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String str = scanner.next();
            int size = str.length();
            for (int i = size - 1; i >= 0; i--) {
                if (isUp(str.charAt(i))) {
                    for (int j = i; j < size - 1; j++) {
                        if (isUp(str.charAt(j + 1)))
                            break;
                        if (isLow(str.charAt(j + 1))) {
                            str = swapStr(str, j, j + 1);
                        }
                    }
                }
            }
            System.out.println(str);
        }
    }
    private static boolean isUp(char a){
        return a >= 'A' && a <= 'Z';
    }
    private static boolean isLow(char a){
        return a >= 'a' && a <= 'z';
    }
    private static String swapStr(String s, int a, int b){
        String strA = s.substring(a, a + 1);
        String strB = s.substring(b, b + 1);
        StringBuilder builder = new StringBuilder(s);
        builder.replace(a, a + 1,  strB);
        builder.replace(b, b + 1, strA);
        return builder.toString();
    }
}

讨论区有感

  1. 判断大小写有现成的方法,Character.isLowerCase()&Character.isUpperCase();
  2. 巧妙的解题思路:将String存到StringBuilder中,从首端开始,找到第一个大写字母,在StringBuilder中append那个大写字母,然后再delete那个大写字母。

              StringBuffer sb = new StringBuffer(sc.nextLine()); 

              int times = 0; 



              for(int i = 0; i < sb.length() - times; i++) { 

                  if(Character.isLowerCase(sb.charAt(i))) 

                      continue; 

                  sb.append(sb.charAt(i)); 

                  sb.delete(i, i + 1); 

                  times++; 

                  i--; 

              } 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值