数组中只有一个数出现了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];
    }
    
    
    

}

 

posted @ 2020-04-24 13:16  乌拉乌拉!!!  阅读(459)  评论(0编辑  收藏  举报