题目介绍
输入2~16进制内的数,返回其中值不相同的。
输入:
输入数值序列行(0<i),每一行分别是进制和数值,以“#”分割。例如,n#m,n为整数,代表n进制(1<n<17),m为进制下数值。
输入样例:
10#15
4#32
4#33
8#17
END
输出样例:
4#32
问题分析:
- 将输入解析。
- 得出结果并输出。
初步程序如下:
public static void main(String[] args) {
Scanner sc = new Scanner( System.in ) ;
List<Integer> list = new ArrayList<>() ;
StringBuilder sb = new StringBuilder();
while ( sc.hasNext()) {
String str = sc.nextLine() ;
if ( str.equals("END")) {
sc.close();
break ;
}
char[] arr = str.toCharArray() ;
for( int i = 0 ; i < arr.length ; i ++ ) {
if ( arr[i] != '#' ) {
sb.append(arr[i]) ;
}
if ( arr[i] == '#' ) {
list.add(Integer.parseInt(sb.toString())) ;
sb.delete(0, sb.length()) ;
}
}
list.add(Integer.parseInt(sb.toString())) ;
sb.delete(0, sb.length()) ;
}
int[] arr = new int [ (list.size())/2] ;
for ( int i = 0 ; i < arr.length ; i ++ ) {
arr[i] = Integer.parseInt(list.get(i*2 + 1 ).toString() , list.get(i*2)) ;
}
if ( arr[0] != arr[1]){
if ( arr[2] != arr[0] ){
System.out.println(list.get(0).toString() +"#" + list.get(1));
}
else{
System.out.println(list.get(2).toString() + "#" + list.get(3));
}
}
else{
for ( int i = 1 ; i < arr.length ; i++ ){
if ( (arr[0] ^ arr[i]) != 0) {
System.out.println(list.get(2*i).toString() + "#" + list.get(2*i + 1 ));
}
}
}
}
结果
初步结果可以实现题目需求。
不足之处
1.占用空间过多。
2. 寻找异数过程是否可以在进行优化。
所学
异或符 ^
异或是一种基于二进制的位运算,用符号XOR或者^表示,其运算法则是对运算符两侧数的每一个进制位同值则取0,异值则取1.
简单理解就是不进位加法,如1+1=0,0+0=0,1+0=1.
For example:
3^5 = 6
转成二进制后就是 0011 ^ 0101 二号位和三号位都是异值取1 末尾两个1同值取零,所以3^5 = 0110 = 6
public static int parseInt(String s, int radix)方法
调用方法:Integer.parseInt(String s , int i ) ;
得到 i 进制 s 的十进制数值。
2019.9.20