首页 > 试题广场 >

算法基础-字符移位

[编程题]算法基础-字符移位
  • 热度指数:36963 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
小Q最近遇到了一个难题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间。
你能帮帮小Q吗?



输入描述:

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



输出描述:

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

示例1

输入

AkleBiCeilD

输出

kleieilABCD
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String s = sc.nextLine();
            swapString(s);
        }
    }

    public static void swapString(String s) {
        char[] ch = s.toCharArray();
        for (int i = 1; i < ch.length; i++) {
            if (ch[i] >= 'a') {
                while (i > 0 && ch[i - 1] <= 'Z') {
                    char tmp = ch[i];
                    ch[i] = ch[i - 1];
                    ch[i - 1] = tmp;
                    i--;
                }
            }
        }
        System.out.println(ch);
    }
}

发表于 2020-04-16 18:12:30 回复(0)
import java.util.Arrays;
import java.util.Scanner;

public class Main {
    
    
    public static void main(String [] args) {
        Scanner r = new Scanner(System.in);
        String str = r.next();
        int count = 0;
        char [] c = str.toCharArray();
        for(int i = str.length()-1;i>=0;i--) {
            if(c[i] >= 'A' && c[i] <= 'Z') {
                
                char c2 = c[i];
                for(int j = i+1;j<str.length()-count;j++) {
                    c[j-1] = c[j];
                }
                
                c[str.length()-1-count] = c2;
                count ++;
            }
        }
        String res = "";
        for(char i : c) {
            res += i;
        }
        System.out.println(res);
    }
}

代码提交上去说我的输出为空,可是我在自己电脑上运行的 完全OK啊
发表于 2019-04-03 23:20:32 回复(0)
思路很直接,遇到大写字母就往后搬。
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        new Main().run(input);
        input.close();
    }

    public void run(Scanner input) {
        while (input.hasNextLine()) {
            String str = input.nextLine();
            char[] cs = str.toCharArray();
            int cntOfUp = 0;
            for (int i = 0; i < cs.length; i++) {
                if (i == cs.length - cntOfUp) {
                    break;
                }
                if ('A' <= cs[i] && cs[i] <= 'Z') {
                    char c = cs[i];
                    for (int j = i; j < cs.length - 1; j++) {
                        cs[j] = cs[j + 1];
                    }
                    cs[cs.length - 1] = c;
                    cntOfUp++;
                    i--;
                }
            }
            System.out.println(String.valueOf(cs));
        }
    }
}

发表于 2018-04-04 17:44:24 回复(0)
import java.util.Scanner;

public class Main {  public static void main(String[] args) {
        Scanner in = new Scanner(System.in); while(in.hasNext()){
        System.out.println(moveCapitalLetters(in.nextLine()));
        }
    }  public static String moveCapitalLetters(String s){  char[] chars = s.toCharArray();  int j;  for(int i=chars.length-1;i>=0;i--){  while(i>=0&&chars[i]>='a'&&chars[i]<='z') i--; if(i<0) break;  char temp = chars[i];  for(j=i;j>0&&j<chars.length-1&&chars[j+1]>='a'&&chars[j+1]<='z';j++){
                chars[j] = chars[j+1];
            }
            chars[j] = temp;
        }  return String.copyValueOf(chars);
    }
}
待解决的问题:
1、Java中字符串是不可变的,要想操作字符,不得不转换为数组。有没有办法直接从命令行读取为字符数组?
2、题目要求保证相对顺序,需要一种稳定的算法,借鉴插入排序思想,实现了二次时间复杂度的方法,时间效率还能再提高吗?

发表于 2018-03-23 14:25:00 回复(0)

import java.util.Scanner;

public class Main {

    public static boolean isLowcase(char c){

        if(c>= 'a' && c<='z')

            return true;

        return false;

    }

    public static void swap(char[] str,int i,int j){

        if(i!=j){

            str[i] ^= str[j];

            str[j] ^= str[i];

            str[i] ^= str[j];

        }

    }

    public static void bubbling(char[] str,int begin,int index){

        while(index != begin){

            swap(str,index-1,index);

            index--;

        }

    }

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        while(sc.hasNext()){

            String str = sc.nextLine();

            char[] charArr = str.toCharArray();

            int begin=0;

            for(int index=0;index<charArr.length;index++){

                if(isLowcase(charArr[index])){

                    if(index!=begin){

                        bubbling(charArr,begin,index);

                    }

                begin++;

                }

            }

            System.out.println(new String(charArr));

        }

    }
}

/**

  • 因为 Java 输入输出的问题,在网上测试时需要以 String 输出结果,不然就会报错

  • 该算法中 begin 指向当前字符串中最靠前的大写字符

  • index 从头开始遍历,碰到小写字符时,用类似冒泡的方法,将该小写移动到 begin 的位置

  • 接着 begin 前移一位,index 继续遍历

*/

编辑于 2017-04-02 18:12:10 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] arg){
        Scanner input = new Scanner(System.in);
        while(input.hasNextLine()){
            char[] s = input.nextLine().toCharArray();
            int len = s.length;
            int j = 0;
            char t;  
            //从后往前 遇到大写字母就交换往后移直到遇到已在尾部大写字母 
            for(int i = len-2; i >= 0; i--){
                //是大写字母 往后移直到遇到大写字母
                if(isA_Z(s[i])){
                    j = i+1;
                    while( j < len && !isA_Z(s[j]) ){
                        t = s[j];
                        s[j] = s[j-1];
                        s[j-1] = t;
                        j++;
                    }
                }
            }
            System.out.println(String.valueOf(s));
        }
    }
    public static boolean isA_Z(char c){
        if(c >= 'A'&& c <= 'Z') return true;
        return false;
    }
}
编辑于 2017-03-19 21:06:12 回复(0)

import java.util.Scanner;

/**
 * Created by 10648 on 2017/2/22 0022.
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String string = scanner.nextLine();
            char [] chars = string.toCharArray();
            int length = string.length();
            for (int i = 0; i < length; i ++) {
                for (int j = 1; j < length - i; j ++) {
                    if ((chars[j-1] >= 'A' && chars[j-1] <= 'Z') &&
                            (chars[j] < 'A' || chars[j] > 'Z')) {
                        char temp = chars[j-1];
                        chars[j-1] = chars[j];
                        chars[j] = temp;
                    }
                }
            }
            System.out.println(String.valueOf(chars));
        }
    }
}
编辑于 2017-02-22 18:53:30 回复(1)
import java.util.Scanner;
public class Main {

/**
* @param args
*/
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while(in.hasNext()){
System.out.println(L(in.nextLine()));
}
}
public static String L(String str){//冒泡排序
int len = str.length();
char ch[] = str.toCharArray();
To:
for(int i=0;i<len;i++){
boolean flag = true;
for(int j=0;j<len-i-1;j++){
if(isUpper(ch[j])&&!isUpper(ch[j+1])){
char c = ch[j];
ch[j] = ch[j+1];
ch[j+1] = c;
flag = false;
}
}
if(flag){
break To;
}
}
return String.valueOf(ch);
}
public static boolean isUpper(char c){
if(c>='A'&&c<='Z'){
return true;
}else{
return false;
}
}

}

发表于 2016-08-03 17:52:37 回复(0)

问题信息

难度:
9条回答 43815浏览

热门推荐

通过挑战的用户