首页 > 试题广场 >

字符串排序

[编程题]字符串排序
  • 热度指数:14091 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

编写一个程序,将输入字符串中的字符按如下规则排序(一个测试用例可能包含多组数据,请注意处理)。

规则 1 :英文字母从 A Z 排列,不区分大小写。

如,输入: Type 输出: epTy

规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。

如,输入: BabA 输出: aABb

规则 3 :非英文字母的其它字符保持原来的位置。

如,输入: By?e 输出: Be?y

样例:

输入:

A Famous Saying: Much Ado About Nothing(2012/8).

输出:

A aaAAbc dFgghh : iimM nNn oooos Sttuuuy (2012/8).



输入描述:




输出描述:


示例1

输入

A Famous Saying: Much Ado About Nothing (2012/8).

输出

A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class Main {
    static class Zm implements Comparable<Zm>{
        Zm(char c){
            this.c = c;
        }
        char c;
        @Override
        public int compareTo(Zm o) {
            int char1 = (int)this.c;
            int char2 = (int)o.c;
            //统一转化成大写字字母(或者小写字母的形式)
            if (char1>=97){
                char1 -= 32;
            }
            if (char2>=97){
                char2 -= 32;
            }
            return char1 - char2;
        }
        @Override
        public String toString() {
            return String.valueOf(c);
        }
    }
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()){
            char[] input = sc.nextLine().toCharArray();
            List<Zm> list = new ArrayList<>();
            String[] other = new String[input.length];
            for (int i=0;i<input.length;i++){
                if (isZm(input[i])){
                    list.add(new Zm(input[i]));
                }else {
                    other[i] = String.valueOf(input[i]);
                }
            }
            Collections.sort(list);
            int j=0;
            for (int i=0;i<input.length;i++){
                //如果其他字符的数组有值,直接输出,跳出当前循环,保障非字母的顺序不变
                if (other[i]!=null){
                    System.out.print(other[i]);
                    continue;
                }
                System.out.print(list.get(j++));
            }
            System.out.println();
        }
    }
    //判断是否是字母
    public static boolean isZm(char c){
        if (c>='A'&&c<='Z'||c>='a'&&c<='z'){
            return true;
        }else {
            return false;
        }
    }
}
//具体思路是实现java的比较器,统一转化成大写,或者小写字符,使用排序,这里的排序要是稳定的
发表于 2018-04-08 15:04:43 回复(0)
插入排序

发表于 2018-01-19 19:16:04 回复(0)

import java.util.*; public class Main{     public static void
main(String[] args){         Scanner in = new Scanner(System.in);
String st = in.nextLine();         char[] ch = st.toCharArray();
for(int i = ch.length-1;i>=0;i--){
if(Character.isLetter(ch[i])){                 for(int j = 0;j
  Character.toUpperCase(ch[j+1])){
  swap(ch,j,j+1);                             }
  }else{                             int k = j+1;
    while(!Character.isLetter(ch[k])&&k
    Character.toUpperCase(ch[k])){
    swap(ch,j,k);                             }
    }                     }                  }             }         }
    for(int i= 0;i

                                                                                    
发表于 2017-05-31 10:52:51 回复(0)

问题信息

难度:
4条回答 25422浏览

热门推荐

通过挑战的用户

查看代码