ASCII码排序--涉及到从控制台读取字符的处理

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 
然后你又按了个回车,回车的ASCII码是13 
所以需要进行如下处理:
    
    b = System.in.read();
     if (b == '\n' || b == '\r')
      break;
     else {
      int num = b - '0';
     }

因为,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]);
	}
}	




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值