牛客奇校验

链接:
原题
来源:牛客网

题目

输入一个字符串,然后对每个字符进行奇校验,最后输出校验后的二进制数(如’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);
        }
    }
}
发布了57 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42419462/article/details/104707170