京东实习笔试——异或

题目主旨:求两个n位的二进制字符串逐位异或,并将其结果转换为十进制数字输出。

解题思路:两个字符串逐位获取并做异或运算,将异或结果保存成一个字符串,然后将前导0去掉,将剩余的0,1字符串使用Integer.valueOf("101010",2)方法转换为十进制数字输出。

package 京东;

import java.util.Scanner;

/**
 * 题目描述 :异或运算是常见的二进制运算,给出两个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
 */
public class Q2017_异或 {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while (scanner.hasNext()) {
			int n = scanner.nextInt();
			String str1 = scanner.next();
			String str2 = scanner.next();

			// 合法性判断
			if (str1.length() != n || str2.length() != n) {
				return;
			}
			StringBuffer sb = new StringBuffer();
			for (int i = 0; i < n; i++) {
				int a = (int) str1.charAt(i);
				int b = (int) str2.charAt(i);
				int c = a ^ b;
				sb.append(c);
			}
			int k = 0;// 标记第一次出现1的位置
			for (int i = 0; i < n; i++) {
				if (sb.charAt(i) == 0) {
					continue;
				} else {
					k = i;
					break;
				}
			}
			if (k == n - 1 && k > 0) {// k>0的目的是为了防止输入的n==1时,如:输入0,1,则输出结果应该为1,而非0
				System.out.println(0);
			} else {
				String string = sb.substring(k, sb.length());
				// 将01字符串转为二进制时用Integer.valueOf("101010",2)
				System.out.println(Integer.valueOf(string, 2));
			}

		}

	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值