链接:
原题
来源:牛客网
题目
输入一个字符串,然后对每个字符进行奇校验,最后输出校验后的二进制数(如’3’,输出:10110011)。
输入描述:
输入包括一个字符串,字符串长度不超过100。
输出描述:
可能有多组测试数据,对于每组数据,
对于字符串中的每一个字符,输出按题目进行奇偶校验后的数,每个字符校验的结果占一行。
示例1
输入
3
3a
输出
10110011
10110011
01100001
分析
题目的难点不是算法,而是审题。我当时做的时候一下懵了,3的奇校验,自然就想到将3转换为二进制 0011 。但这是四位,那么我们补上4个零,0000 0011 。奇校验需要保证最后的1的个数为奇数。当我们发现1的个数是偶数2,那么即使加上1也不是示例的答案。
后来想到了ASCII码,但就脑子里过了一下就去做其他题了。最后经过查阅确实是先将3转换为ASCII码,然后再将对应的ASCII码值转换为二进制,最后再进行奇校验。
观察后,我们会发现示例中的答案是将添加的校验位放到了最高位上 。
十进制 | ASCII码 | 二进制 | 奇校验后 |
---|---|---|---|
3 | 51 | 0011 0011 | 1011 0011 |
a | 97 | 0110 0001 | 0110 0001 |
知道了原由,代码其实不难
代码
import java.util.Scanner;
public class Main{
//处理的方法
public static void process(String s){
char[] chars = s.toCharArray();
for(int i = 0;i < chars.length;i++){
//将字符转换为ASCII码值
int a = chars[i] - 0;
//获得二进制串
StringBuilder binary = new StringBuilder(Integer.toBinaryString(a));
if(binary.length() < 8){
int len = 8 - binary.length();
for(int j = 0;j < len;j++){
binary.insert(0,"0");
}
}
//统计字符串中的1的个数
int count = 0;
for(int j = 0;j < binary.length();j++){
if(binary.charAt(j) == '1'){
count++;
}
}
if(0 == count % 2){
//偶数需要将最高位填个1
System.out.println("1"+binary.substring(1));
}else{
System.out.println(binary);
}
}
}
//主方法
public static void main(String[] args){
//输入流
Scanner in = new Scanner(System.in);
while(in.hasNextLine()){
String s = in.nextLine();
process(s);
}
}
}