zoukankan      html  css  js  c++  java
  • 字符串排序

    题目描述

    编写一个程序,将输入字符串中的字符按如下规则排序。

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

          如,输入:Type 输出:epTy

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

        如,输入:BabA 输出:aABb

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

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

    样例:

        输入:

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

        输出:

       A aaAAbc dFgghhiimM nNn oooos Sttuuuy (2012/8).

    输入例子:
    A Famous Saying: Much Ado About Nothing (2012/8).
    
    输出例子:
    A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).

    思路:把字符串中的字母取出来,利用冒泡稳定排序对字母排序,其中的字母排序时统一为小写或是,但是交换位置时还是原来字母,然后再把字母放到相对应的位置
     1 import java.util.ArrayList;
     2 import java.util.List;
     3 import java.util.Scanner;
     4 
     5 public class Main {
     6 
     7     public static void main(String[] args) {
     8         Scanner sc = new Scanner(System.in);
     9         while(sc.hasNextLine()){
    10             String s = sc.nextLine();
    11             sortStr(s);
    12         }
    13     }
    14     
    15     public static void sortStr(String s){
    16         List<Character> li = new ArrayList<Character>();
    17         for(int i=0;i<s.length();i++){//把字符串中的字母取出来
    18             if(String.valueOf(s.charAt(i)).matches("[a-zA-Z]")){
    19                 li.add(s.charAt(i));
    20             }
    21         }
    22         
    23         for(int i=0;i<li.size();i++){//使用冒泡排序对字母进行稳定排序
    24             for(int j=li.size()-2;j>=i;j--){
    25                 char tem1=' ';
    26                 char tem2=' ';
    27                 if(li.get(j)>=97){
    28                     tem1=(char)(li.get(j)-32);
    29                 }else{
    30                     tem1=li.get(j);
    31                 }
    32                 if(li.get(j+1)>=97){
    33                     tem2=(char)(li.get(j+1)-32);
    34                 }else{
    35                     tem2=li.get(j+1);
    36                 }
    37                 if(tem1>tem2){
    38                     char temp=li.get(j);
    39                     li.set(j,li.get(j+1));
    40                     li.set(j+1,temp);
    41                 }
    42             }
    43         }
    44         int j=0;
    45         StringBuffer sb = new StringBuffer(s);
    46         for(int i=0;i<s.length();i++){//把排好的字符放到相对应的位置
    47             if(String.valueOf(s.charAt(i)).matches("[a-zA-Z]")){
    48                 sb.replace(i,i+1, String.valueOf(li.get(j++)));
    49             }
    50         }
    51         System.out.println(sb);
    52     }
    53 
    54 }

    下面代码参考网友,思路一样,但是代码质量较高:

     1 import java.util.*;
     2 public class Main {
     3     public static void main(String args[]){
     4         Scanner cin =new Scanner(System.in);
     5         while(cin.hasNext()) {
     6             String s = cin.nextLine();
     7             List<Character> list = new ArrayList<>();
     8             char[] array = s.toCharArray();
     9             //先把字母收集起来
    10             for (char c : array) {
    11                 if (Character.isAlphabetic(c)) {
    12                     list.add(c);
    13                 }
    14             }
    15             //对字母进行排序,忽略大小写
    16             Collections.sort(list, new Comparator<Character>() {
    17                 @Override
    18                 public int compare(Character o1, Character o2) {
    19                    return Character.toUpperCase(o1)-Character.toUpperCase(o2);
    20                 }
    21             });
    22             //将排好序的字母替换到对应的位置
    23             for (int i = 0; i < array.length; i++) {
    24                 if (Character.isAlphabetic(array[i])) {
    25                     array[i] = list.remove(0);
    26                 }
    27             }
    28             for (char c : array) {
    29                 System.out.print(c);
    30             }
    31             System.out.println();
    32             list.clear();
    33         }
    34     }
    35 }
    
    
  • 相关阅读:
    C++中unique函数的用法总结
    洛谷P1039侦探推理题解
    洛谷P1040 加分二叉树题解
    洛谷P1038 神经网络题解
    emmm
    biiset用法
    浅谈接口与抽象类的区别
    递归调用——数学观点看递归
    反转字符串
    SQL 时间戳转DateTime类型
  • 原文地址:https://www.cnblogs.com/crazybuddy/p/5361469.html
Copyright © 2011-2022 走看看