1.想法:
这道题我的想法是完全没问题的
1.合并字符串
2.对奇偶数分别进行排序
3.翻转每个字符
4.转换成大小写
按道理来讲就应该没有任何的问题的,测试数据也是完全通过的,但是一编译就报错
就是提示
我是把所有的数组都改了一遍还是不能解决问题,数组越界是发生在哪个区域,完全的不知道.
[痛骂.jpg]
牛客网这个辣鸡的编译器,提示信息也太少了吧
唉!不能改变人家,只能从自身的问题入手,到底是哪里出了问题????
一遍遍的对比别人的代码,结果发现一个重大的错误!!!
条件是: (0-9 或者A-F或者 a-f)
我自己在判断数据转换的时候,少了一个A-F,结果发生了数组溢出,其实这种完全不给测试数据是什么的编译器,很蠢,但是我们不能改变什么所以,只能从自己的身上找原因
然后我就发现自己的解决过程有很大的问题,只是写清楚了步骤没有罗列条件是什么,输出是什么结果白白浪费了好长时间用于查找问题.所以我们在处理算法题的时候一定要写清楚输入什么,输出是什么,解决的步骤是什么.
而且如果题目没有罗列出来所有的字符串还是将条件分为已说明的字符串和未说明的字符串
2.代码:
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
String str1 = in.next();
String str2 = in.next();
ProcessString(str1, str2, ""); //开始处理
}
}
public static void ProcessString(String str1, String str2, String strOutput) throws Exception {
String str3 = str1 + str2;
if (str3 == null || str3.length() == 0) { //进行判空
System.out.println("");
}
List<Character> odd = new ArrayList<>();
List<Character> even = new ArrayList<>();
char[] chs = str3.toCharArray();
for (int i = 0; i < chs.length; i++) {
if (i % 2 == 0) {
even.add(chs[i]);
} else {
odd.add(chs[i]);
}
}
Collections.sort(even);
Collections.sort(odd);
int evenIndex = 0, oddIndex = 0;
for (int i = 0; i < chs.length; i++) {
char ch;
if (i % 2 == 0) {
ch = even.get(evenIndex++);
} else {
ch = odd.get(oddIndex++);
}
if ((ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F')) {
chs[i] = overChar(ch);
} else {
chs[i] = ch;
}
}
strOutput = String.valueOf(chs); //将char数组转化为String
System.out.println(strOutput);
}
private static char overChar(char c) {
String res;
if (c >= 'a' && c <= 'f') {
res = Integer.toBinaryString(c - 'a' + 10);
} else if (c >= 'A' && c <= 'F') {
res = Integer.toBinaryString(c-'A'+10);
} else {
res = Integer.toBinaryString(c - '0');
}
while (res.length() < 4) { //不是所有的数字转换后刚好为4位,这个在其他位转化中也同样使用
//例如char的范围为0-255,那么如果为想转化为8位的话,0只有1位而3只有2位为11
res = "0" + res;
}
int result = 0;
for (int i = 0; i < res.length(); i++) {
result += (res.charAt(i) - '0') * (Math.pow(2, i));
}
char ch;
if (result > 9) {
ch = (char) (result - 10 + 'a');
} else {
ch = (char) (result + '0');
}
if (ch >= 'a' && ch <= 'z') ch = (char) (ch - 'a' + 'A');
return ch;
}
}
两个总结:
1.将char数组转化为String的做法是:String res = String.valueOf(char[])
而不是
String res = char[].toString();
2.如果使用将int变成二进制的String,一定要记得,其位数可能不够
String res = Integer.toBinaryString(1); //它是一个1不是0001