OJ系列-UVA10082(WERTYU)java版
签到,今天是连续OJ系列的第二天!
今天的重点是:细心!!!
题目描述
把手放在键盘上时, 稍不注意就会往右错一位。 这样, 输入Q会变成输入W, 输入J会变成输入K等。 键盘如图所示。输入一个错位后敲出的字符串( 所有字母均大写) , 输出打字员本来想打出的句子。 输入保证合法, 即一定是错位之后的字符串。 例如输入中不会出现大写字母A。
样例输入:
O S, GOMR YPFSU/
样例输出:
I AM FINE TODAY.
首先还是细读题目,看给出的键盘键位的分布,可以知道在输入的时候是不会输入“ ` ”,“ A ”,“ Z ”这三个字符,也可以知道输不出“ = ”,“ \ ”,“ ’ ”, “ / ”,尽管这些和解此题没有太大关系,不过说不定换个题就关系了,所以读题的时候要充分挖掘信息。这题和UVA272差别不大,都是读字符串再替换,读字符串的做法和UVA272一样,都是IO加循环,替换也不难,先将键盘上相关的键位定义到一个字符数组,在定义字符数组的时候一定要根据图上的键盘来定义,完成字符数组过后,每读一个字符就将它和数组中的字符相比较,如果相等就替换成前一个元素,其中还有一个细节就是空格和换行是不在字符数组中,但输入的字符串中是可能有空格和换行的。接下来就是写代码了
代码实现
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Uva10082 {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
String k="`1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./";
char []c=k.toCharArray();
char n=0;
//char [] c={'`','1','2','3','4','5','6','7','8','9','0','-','=','Q','W','E','R','T','Y','U','I','O','P','[',']','\\','A','S','D','F','G','H','J','K','L',';','\'','Z','X','C','V','B','N','M',',','.','/'};
BufferedReader cin=new BufferedReader(new InputStreamReader(System.in));
while((n= (char) cin.read())!=(char)-1){
if(n==32){//空格符的ASCII码值
System.out.print((n));
continue;
}
if(n==10){//换行符的ASCII码值
System.out.print(n);
continue;
}
for(int i=1;i<c.length;i++){
if(c[i]==n){
System.out.print(c[i-1]);
break;//找到就退出,不用在继续循环,减少时间
}
}
}
}
}
说明
和UVA272一样,复制来的字符串有换行的,会中断,可以将读取写成读文件检验代码的准确度,这是最好的方式,因为在比赛的时候,输入的数据就是从文件中读取,将输出的数据与答案文档比较,来判定能不能AC。这里我开始放了两个低级的错误,就是开头说的细心问题,一是忘了将’0’定义在字符数组中,二是在定义字符数组的时候,我将数字字符直接写成了,1,2,3,4,而不是‘1’,‘2’,‘3’,这两种写法是有巨大的差别的,后来我就干脆用字符串转字符数组了,之后一次就过,之前一次次的错误还是很煎熬的,所以还是细心细心细心!!!