概述
题目描述
给定一个整型数组arr和一个大于1的整数k。已知arr中只有1个数出现了一次,其他的数出现k次,请返回出现了1次的数。
输入描述:
输入包含两行,第一行包含两个整数n和k,n代表数组arr的长度,第二行n个整数,代表数组arr,数组arr中每个数都是32位整数。
输出描述:
输出一个整数,代表唯一出现1次的数。
示例1
输入
7 3
5 4 1 1 5 1 5
输出
4
解法一:先转成K进制数
k进制数的k个数第i位数不进位相加对k取余是0
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws Exception{
/* BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] info = br.readLine().trim().split(" ");
int len = Integer.parseInt(info[0]);
int k = Integer.parseInt(info[1]);
String[] ss = br.readLine().trim().split(" ");
int[] arr = new int[len];
for(int i=0;i<len;i++){
arr[i] = Integer.parseInt(ss[i]);
}*/
Scanner sc = new Scanner(System.in);
int len = sc.nextInt();
int k = sc.nextInt();
int[] arr = new int[len];
for(int i=0;i<len;i++){
arr[i] = sc.nextInt();
}
getRes(arr,k);
}
public static void getRes(int[] arr,int k){
int[] res = new int[32];//记录k进制数
for(int i=0;i<arr.length;i++){
changeKgetRes(res,arr[i],k); //转成k进制后相加
}
int realRes = kToTen(res,k);//k进制转十进制
System.out.println(realRes);
}
public static void changeKgetRes(int[] res,int a,int k){
int[] ka = tenToK(a,k);
for(int i=0;i<32;i++){
res[i] = (res[i]+ka[i])%k;
}
}
public static int[] tenToK(int a,int k){
int[] ka = new int[32];
int index = 0;
while(a!=0){
ka[index++] = a%k;
a = a/k;
}
return ka;
}
public static int kToTen(int[] ka,int k){
int a = 0;
for(int i=31;i>=0;i--){
a = a*k+ka[i];
}
return a;
}
}
最后
以上就是优美纸飞机为你收集整理的程序员代码面试指南刷题--第七章.在其它数都出现k次的数组中找到只出现一次的数的全部内容,希望文章能够帮你解决程序员代码面试指南刷题--第七章.在其它数都出现k次的数组中找到只出现一次的数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复