2017京东实习生笔试题之异或

一、题目描述
异或运算是常见的二进制运算,给出两个n位二进制数a,b。a异或b的运算依次考虑二进制的每一位,若这一位相同,那么这一位的异或结果就是0,不同就是1。
例如a=1100, b=0100。执行a异或b的运算,a的最高位是1,b的最高位是0,两个数字不同所以最高位异或结果是1;a和b次高位都是1,所以次高位异或为0;最后两位它们都是0,所以异或结果也都是0。那么a异或b的答案就是1000。
现在输入两个n位二进制数,输出它们异或结果的十进制答案。上述样例中异或的二进制结果为1000,转化成十进制就是8。

二、输入
输入有三行,第一行一个数n(1<=n<=20),接下来两行有两个n位二进制数。输入的二进制数可能有前导零。
样例输入
4
1100
0100

三、输出
输出一个数,异或结果的十进制数值,不要输出前导零。
样例输出
8
时间限制
C/C++语言:2000MS其它语言:4000MS
内存限制
C/C++语言:65536KB其它语言:589824KB

四、总结
总的来说,这道题目算是很简单的了。自己看了官方给的答案:先把二进制字符串转为十进制,再使用^运算符得出结果。
但是我觉得这并没有体现描述中的内容,如果直接使用运算符那这道题就是单纯的考进制的转换了。
所以我个人当时把异或部分按照定义实现而没有使用运算符直接计算,然后再把异或完的结果转为十进制。
不过比较遗憾的是,写完后发现通过率只有百分之十,囧!就使劲想着是不是有什么特殊情况没有考虑,比如输入的字符串包不包含前导零,字符串的长度是否超出限制等等,改完后通过率为百分之二十,最后考完自己检查了代码才发现竟然是进制转换那里写错了….渣渣!
下面是自己整理后的代码,感觉很复杂,有不正之处,请多指教!

import java.util.Scanner;

public class xor {
    public static void main(String[] args){
        //输入数据
        Scanner sc = new Scanner(System.in);  
        int n = sc.nextInt();
        String num1 = sc.next();
        String num2 = sc.next();
        //补充前导零
        StringBuilder  zero = new StringBuilder();
        int num = Math.abs(num1.length() - num2.length());
        int max = num1.length() > num2.length()? num1.length():num2.length();
        for(int a = num ;a > 0;a--)
            zero.append(0);
        if(num != 0 && max == num1.length())
            num2 = zero.toString() + num2;
        else
            num1 = zero.toString() + num1;
        //长度是否符合要求
        if(num1.length() > 20)
            num1 = num1.substring(0, 20);
        if(num2.length() > 20)
            num1 = num2.substring(0, 20);
        //异或实现
        StringBuilder result = new StringBuilder();
        for(int i = 0;i < num1.length(); i++){
            if(num1.charAt(i) != num2.charAt(i))
                result.append(1);
            else
                result.append(0);
        }
        //输出异或结果的十进制
        System.out.println(getNum(result.toString()));
    }

    public static int getNum(String bin) {
        int sum = 0;
        int len = bin.length();
        for(int i = 0;i < len; i++){
            int k =bin.charAt(i) - 48;
            //当时写成了int j = len - 1导致通过率只有百分之十
            for(int j= len-1-i;j > 0 && k > 0;j--)
                k = k * 2;
            sum += k;
        }
        return sum;
    }
}

五、扩展
感觉自己写方法好笨好繁杂,在网上发现了一个简洁的版本学习一下

public static void main(String[] args) {
        Scanner in= new Scanner(System.in);
        int N = in.nextInt();
        String str1 = in.next();
        String str2 = in.next();
        int[] C = new int[N];
        int result = 0;

        char[] A = str1.toCharArray();
        char[] B = str2.toCharArray();

        for ( int i = 0 ; i < N ; i++){
            C[i] = (A[i] != B[i])? 1:0;
            result = result * 2 + C[i] ;
        }
        System.out.println(result);

        in.close();
    }

这就是差距啊!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值