ASCII码排序
时间限制:3000 ms | 内存限制:65535 KB
难度:2
-
描述
-
输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符。
-
输入
- 第一行输入一个数N,表示有N组测试数据。后面的N行输入多组数据,每组输入数据都是占一行,有三个字符组成,之间无空格。 输出
- 对于每组输入数据,输出一行,字符中间用一个空格分开。 样例输入
-
3 qwe asd zxc
样例输出
-
e q w a d s c x z
分别用工具类自带的Array.sort()和自己写的直接插入排序进行实现。耗时和内存分别为:78307和44 369
看了下别人的最优代码(C语言):
<span style="font-family:Comic Sans MS;">
#include "stdio.h"
main()
{
char a,b,c,d;
int i;
scanf("%d",&i);
getchar();
while(i--)
{
scanf("%c%c%c",&a,&b,&c);
getchar();
if (a>b) {d=a;a=b;b=d;}
if (a>c) {d=a;a=c;c=d;}
if (b>c) {d=b;b=c;c=d;}
printf("%c %c %c\n",a,b,c);
}
}
</span>
然后就试着用java实现了下,看要用多久,发现在控制台读取字符,就繁琐,完败了。
用到的是System.in.read();而他是有局限性的。
用:char ch=(char)System.in.read();来得到字符。(要进行try catch来捕获异常)
但是这个方法有局限性:
System.in.read接收的是字节0-255
你输入个1以后,其实返回的是ASCII码,也就是49
if (b == '\n' || b == '\r')
break;
else {
int num = b - '0';
你输入个1以后,其实返回的是ASCII码,也就是49
然后你又按了个回车,回车的ASCII码是13
所以需要进行如下处理:
b = System.in.read();
}
因为,java在处理字符串之间,会涉及到转换,需要有方法很方便,但是却很耗时间的。这方面是弊端吧
最后附上自己的代码:
import java.io.IOException;
import java.util.Arrays;
import java.util.Scanner;
/*
* ASCII码排序 字符之间的比较式按ascii码进行比较,排序的
*/
public class Main {
public static void main(String[] args){
Main main=new Main();
/*Scanner cin=new Scanner(System.in);
while(cin.hasNext()){
int n=cin.nextInt();
//用字符串保存,在转数组,耗时间
for(int i=0;i<n;i++){
String str=cin.next();
main.compareSort(str);
}
}*/
//用System.in.read来得到字符
try {
int n=System.in.read()-'0';
char[] chArr=new char[3];
char d;
while(n-->0){
int i=0;
while(i<3){
d=(char)System.in.read();
if(d=='\n'||d=='\r'){
//当打入数字按回车时,把错误的信息剔除掉(会多出回车+默认的格式)
}
else{
chArr[i]=d;
i++;
}
}
main.compareSort(chArr);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//直接用Arrays.sort 78 307
public void compareArraysSort(String str){
char[] chArr=str.toCharArray();
Arrays.sort(chArr); //直接用这个很省事,但是这个方法时快速排序,对付少量的数据会很慢
for(char ch:chArr)
System.out.print(ch+" ");
System.out.println();
}
//自己写的直接插入排序 44 369
public void compareSort(String str){
char[] chArr=str.toCharArray();
for(int j=0;j<chArr.length;j++){ //只要遍历一遍即可,
int i=j; //不将j赋给i,则会做重复的判断,i变小了
char ch=chArr[i]; //取出保存,后面要交换
while(i>0&&chArr[i-1]>ch){ //i为0,则已经到末尾,直接加上,
chArr[i]=chArr[i-1]; //当前一个大于后一个,交换,i--,继续循环下去
i--;
}
chArr[i]=ch; //最后腾出的空位,加入
}
for(char ch:chArr)
System.out.print(ch+" ");
System.out.println();
}
//本想用字符(a,b,c进行比较的)来比较处理,但是发现字符处理太麻烦了,没有找到更好的方法
public void compareSort(char[] chArr){
char d;
<span style="white-space:pre"> </span>if(chArr[0]>chArr[1]){
<span style="white-space:pre"> </span>d=chArr[0];
<span style="white-space:pre"> </span>chArr[0]=chArr[1];
<span style="white-space:pre"> </span>chArr[1]=d;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>if(chArr[0]>chArr[2]){
<span style="white-space:pre"> </span>d=chArr[0];
<span style="white-space:pre"> </span>chArr[0]=chArr[2];
<span style="white-space:pre"> </span>chArr[2]=d;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>if(chArr[1]>chArr[2]){
<span style="white-space:pre"> </span>d=chArr[1];
<span style="white-space:pre"> </span>chArr[1]=chArr[2];
<span style="white-space:pre"> </span>chArr[2]=d;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>System.out.printf("%c %c %c\n",chArr[0],chArr[1],chArr[2]);
}
}