K times and appear appear more than once

Topics are as follows:
Here Insert Picture Description

public class 出现K次与出现1{

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// mytest();

		// 位运算解法
		int a[] = { 2, 2, 2, 9, 7, 7, 7, 3, 3, 3, 4, 4, 4, 5, 5, 5 };
		int len = a.length;
		// 转成K进制字符数组
		//字符的二维数组,用来存储每个数字的三进制的每一位
		char[][] kRadix = new char[len][];
		int k = 3;
		//记录最长的三进制位数,这样才知道有多少列
		int maxLen = 0;
		// 对于每个数字
		for (int i = 0; i < len; i++) {
			//求每个数字的三进制字符串并翻转,然后转为字符数组
			kRadix[i] = new StringBuilder(Integer.toString(a[i], k)).reverse().toString().toCharArray();
			if (kRadix[i].length > maxLen) {
				maxLen = kRadix[i].length;
			}
		}
		
		int[] resArr = new int[maxLen];
		//遍历每一行
		for (int i = 0; i < len; i++) {
			// 遍历每一列,不进位加法
			for (int j = 0; j < maxLen; j++) {
				if (j >= kRadix[i].length) {
					//不足最长列数的三进制数,后面补0
					resArr[j] += 0;
				} else {
					//否则家加上当前这一位的数字(减去'0',就是将字符转换为数字)
					resArr[j] += (kRadix[i][j] - '0');
				}
			}
		}
		
		int res = 0;
		for (int i = 0; i < maxLen; i++) {
			//取余之后乘以k的i次方,例如8%3=2, 看2在哪一列,如果在第一列乘以3的0次方,第二列乘以3的1次方
			res += (resArr[i] % k) * (int) (Math.pow(k, i));
		}
		System.out.println(res);

	}

	public static void mytest() {
		int a[] = { 2, 2, 2, 9, 7, 7, 7, 3, 3, 3, 4, 4, 4, 5, 5, 5 };

		int[] helper = new int[a.length];
		for (int i = 0; i < helper.length; i++) {
			helper[a[i]]++;
		}
		for (int i = 0; i < helper.length; i++) {
			if (helper[i] == 1) {
				System.out.println(i);
				break;
			}
		}
	}

}

Published 60 original articles · won praise 4 · Views 1293

Guess you like

Origin blog.csdn.net/qq_43966129/article/details/104928205