数组中只有一个数出现了1次 其他数都出现了K次 请输出只出现一次的数
数组中只有一个数出现了1次 其他数都出现了K次 请输出只出现一次的数
java 代码加分析
/** * */ package com; /** * * 信1605-1 HJJ * * 数组中只有一个数出现了1次 其他数都出现了K次 请输出只出现一次的数 * K 个k进制数做不进位加法结果为0 例如 二进制 的1 +1 不进位=0 * * 因此把数组中的数做不进位加法的最终结果是落单的数 * * 111 012 * 012 * ---- * 021 * 012 * 0 * 111 * ----- * */ public class Test4 { private static int K=3;//出现的次数 private static int lengthi=-1;//arrint数组中化简为二进制的最大 位数 public static void main(String[] args) { int arrint[]= {6,6,6,2,2,2,3,4,5,5,5,4,4,600,600,600};//自己构造的数组 //获取最大位数lengthi for (int i = 0; i < arrint.length; i++) { if (lengthi<Integer.toString(arrint[i], K).toCharArray().length) { lengthi=Integer.toString(arrint[i], K).toCharArray().length; } } System.out.println("当数组转成"+K+"进制后字符串最长长度为"+lengthi); char sum[]=new char[lengthi]; //总的计算结果临时变量 /** * 这里需要翻转数组因为加法的时候 一定低位和低位加 当然别的方法也可以只要不加错位就行 * new StringBuffer().append(Integer.toString(arrint[i], K).toCharArray()).reverse(); 例如 二进制 1100 1存放在数组中反过来 1 排在数组第一位 1100 最后那个0也在第一位 这样循环起来方便 * * * * * */ for (int i = 0; i < arrint.length; i++) { StringBuffer s=new StringBuffer().append(Integer.toString(arrint[i], K).toCharArray()).reverse(); for (int j = 0; j < lengthi; j++) { if (j<s.length()) { sum[j]= intToChar((charToInt(sum[j])+charToInt(s.charAt(j)))%3); } } } StringBuffer ss=new StringBuffer().append(sum).reverse(); System.out.println("落单的数为"+Integer.parseInt(ss.toString(), K)); //Integer.parseInt(ss.toString(), K) 把字符串转成相关进制数 应该只能是无符号(不能出现负数了)数有弊端 } /* * char 转int 直接强转数值不对 * * * */ public static int charToInt(char ch) { int num=0; if (Character.isDigit(ch)){ // 判断是否是数字 num = (int)ch - (int)('0'); return num; } return num; } /* * int 转char 直接强转数值不对 对于ASCII表看看就知道 * * * */ public static char intToChar(int ch) { String ss= String.valueOf(ch); return ss.toCharArray()[0]; } }