出现1次和k次的数

  • 1、分析问题
  • 2、hashMap解决法
  • 3、不进位加法解法

1、分析问题

先解读一下题目的意思,在一堆数中,只存在一个数仅出现了一次,其他的数都出现了k次(k>1),例如:arr[] = {2,2,2,7,7,7,8,9,9,9}; 在arr中,只有8出现了一次,其他的元素均出现了3次,现在,我们需要找出这个单独的数。

2、hashMap解决法

使用 hashMap作为容器存储每一个元素和它的出现次数,遍历每一个元素,若当前元素存在与map中,则令它的value值+1,若不存在,则put进map容器中,最后将kep为1的键输出即可获得只出现一次的那个数

/*** 只有一个数出现了一次,其他数都出现了k次,找出这个数* @author asus 黑虎阿福**/
public class 出现k次与出现一次 {public static void main(String[] args) {int arr[] = {2,2,2,3,3,3,18,7,7,7,8,8,8};//2 3 18 7 8//使用hashMap作为容器存储元素和它的出现次数Map<Integer,Integer> map = new HashMap<Integer,Integer>();for(int i=0;i<arr.length;i++) {//判断当前map容器是否包含指定的key值,若包含,将其对应的表示次数的value值+1if(map.containsKey(arr[i])) {map.put(arr[i], map.get(arr[i])+1);//map修改value值只需保持key值相同即可//也可以使用replace进行替换,同样需要保持key相同}else {map.put(arr[i], 1);//若当前元素不存在容器,则put进容器并设置其出现次数为1}}//遍历mapfor (Integer key : map.keySet()) {//找出value为1对应的keyif(map.get(key)==1) {System.out.println(key);}}    }
}

3、不进位加法解法

首先,我们需要了解不进位加法的逻辑:对于k个k进制数相加,它们的和一定为k的倍数。所以,我们可以将所有的数转化为k进制,然后将这些数的每一个k进制位上的值累加,做%k处理,最后得到的结果拼在一起就是这题的解。

以下以k=3为例
arr[] = {2,2,2,9,7,7,7,3,3,3,6,6,6,0,0,0}将每个元素转化为3进制
kradix[] = {002,002,002,100,021,021,021,010,010,010,020,020,020,000,000,000}对每一位元素的k进制的每一位进制数做累加处理2            0  0  2     2           0  0  22            0  0  29            1  0  07            0  2  17            0  2  17            0  2  13            0  1  03            0  1  03            0  1  06            0  2  06            0  2  06            0  2  00            0  0  00            0  0  00            0  0  0
-----------------------------------1 15  9
将每一位进制数累加得到的结果做%3处理,它们取余的结果组成的3进制就是只出现一次的数1%3  15%3  9%31     0     0
-----------------------------------9

在转换为k进制的时候,我们还需要做一个小小的处理 :

public class 出现一次与出现k次的数2 {public static void main(String[] args) {int[] arr = { 2, 2, 2, 2, 9, 7, 7, 7, 7, 3, 3, 3, 3, 6, 6, 6, 6, 0, 0, 0 , 0};//用于存每个数字的三进制的每一位char[][] kRadix = new char[arr.length][];//[[2],[2],[2],[1,0,0]...]int k = 4;// arr中元素转化为三级制的最大长度int maxLen = 0;// 对于每个数字,转换成k进制字符数组for (int i = 0; i < arr.length; i++) {// 为了使每一位的三进制低位对齐,每一数字的三进制字符串并翻转,然后转为字符数组kRadix[i] = new StringBuilder(Integer.toString(arr[i], k)).reverse().toString().toCharArray();if (kRadix[i].length > maxLen) {// 更新最大长度maxLen = kRadix[i].length;}}// 不进位加法int[] resArr = new int[maxLen];//遍历数组中的每一个数for (int i = 0; i < arr.length; i++) {// 不进位加法:maxLen是最大的进制位for (int j = 0; j < maxLen; j++) {/*以下逻辑就是累加每一位元素的反转三进制的位数* 对于不够maxLen位的三进制,默认高位补0*///第i个元素对应的三进制反转串:kRadix[i]//j代表对应三进制的每一位,若j大于了当前元素的三进制位数,则默认补0if (j >= kRadix[i].length) {resArr[j] += 0;} else {//若j小于当前元素的三进制位数,则为有效数据,对其进行存储// 加上一个数字,减‘0’是为了转换成数字resArr[j] += (kRadix[i][j] - '0');}}}int res = 0;//2个相同的2进制数做不进位加法,值为0//k个相同的k进制数做不进位加法,值为0//因为k个相同的数相加相加一定是k的倍数,又不进位加法,所以值一定为0//对于k进制,每一位进制数的取值都是相同的,所以可以分别取出每一位元素的进制位进行累加//例如:2,001,12   ((2+0+1)%3)*3的0次方//((0+0+2)%3)*3的一次方//对于重复出现k次的元素,最后都会在%3这里被消除,最后剩下的就是只出现一次的那个数for (int i = 0; i < maxLen; i++) {res += (resArr[i] % 4) * (int) (Math.pow(k, i));// 乘k的i次方}System.out.println(res);}
}

#每天一道算法题:出现一次与出现k次的数相关推荐

  1. 每天一道算法题系列十七之电话号码的字母组合

    每天一道算法题系列: 来源:力扣(LeetCode) 本题链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-numb ...

  2. 一天一道算法题--5.30---递归

    感谢微信平台:  一天一道算法题 --------每天多一点进步--------- 今天 休假 这题 也很水 能发现 规律就好 明天 再也不能这样了 forgive me ---------- 转载于 ...

  3. 一天一道算法题--6.15--卡特兰数

    感谢微信平台---一天一道算法题---每天多一点进步- problem: 12个高矮不同的人 排成两排 每排必须是从矮到高排列 而且第二行比对应的第一排的人高 问排列方式有多少种? analyse: ...

  4. 一道算法题跟大家分享

    无意中看到一道算法题,拿出我的解法与大家分享. 题目:输出1,2,3,4四个数字能组成的互不相同且无重复的三位数并统计满足条件的三位数个数 大家先想想,再看答案吧. View Code 1 /// & ...

  5. 搜狗2020秋招笔试的一道算法题

    搜狗2020秋招的一道算法题 有A,B,C三种样品,凑齐三个样品各一个就可以领取一个奖品.任意两个样品可兑换另一种样品,如AA可兑换一个B或一个C,AB可兑换一个C.输入ABC,问最多可以领取多少奖品 ...

  6. 每天一道算法题系列十二之整数转罗马数字

    每天一道算法题系列: 来源:力扣(LeetCode) 本题链接:https://leetcode-cn.com/problems/integer-to-roman/ 来源是力扣,大家喜欢可以去力扣中文 ...

  7. 截止目前为止,我遇到的最难的一道算法题:计算相邻两个数的最大差值

    hello,今天给大家带来一道算法题.这道算法题,是我目前为止,见过最难的一道题.那么到底是怎样的一道算法题呢?如下: 题目:给定一个数组, 求如果排序之后, 相邻两数的最大差值. 要求时间复杂度O( ...

  8. Homebrew作者面试Google被拒,只因写不出一道算法题

    相信很多人听说过关于Max Howell(Homebrew的作者)的故事: Max Howell在Google面试,但Google拒绝了他,给出的答复是:"虽然我们90%的工程师都用你写的软 ...

  9. 最佳买卖股票时间 Java_一道算法题的讲解-买卖股票的最佳时间

    今天讲解一道简单的算法题: 问题描述 假设我们有一个数组, 数组中按顺序每个元素的值表示当天的股票价格. 例如,数组: [7,1,5] 表示股票第一天是7元,第二天是1元,第三天是5元 约定,只能买一 ...

  10. 怎么判断一个字符串的最长回文子串是否在头尾_每日一道算法题,让你的头脑更活跃(寻找最长回文子串)...

    前言 最近准备把算法慢慢的捡起来,所以准备日更一道算法题目,难度自然是由简入难,所以同学们可以每天都来看看小编的更新. 日更时间定在每晚20:00,希望大家多多关注啦. 昨天就欠更了,简直就是打脸.过 ...

最新文章

  1. OpenCV(项目)二维码识别(二维码、条形码)
  2. PMCAFF产品经理第一课 | 杭州站 现场集锦
  3. CH0103最短Hamilton路径 poj2288 Islands and Brigdes【状压DP】
  4. wxWidgets:wxCheckBox类用法
  5. Django apache2 安装配置
  6. 牛客多校10 - Identical Trees(dp+二分图最小权匹配)
  7. 实战:微信小程序支付开发具体流程
  8. 一步步编写操作系统 1 部署工作环境 1
  9. 有道词典Mac版崩溃信息
  10. 6.企业应用架构模式 --- 会话状态
  11. PHP 实现简单购物车功能(2)
  12. 含有REF CURSOR 的过程只能有一个out参数?
  13. 在Dynamics 365 Fo/AX2012中获取不同类型的时间
  14. oracle 定时备份数据库脚本
  15. [C#]WPF 3D 绘制一个正方体并调整视场角
  16. 使用Xbrowser远程连接REHL6.5
  17. 【STL】11 list容器操作
  18. 【已解决】笔记本电脑连接wifi异常(无法连接到这个网络)
  19. 20135203齐岳 信息安全系统设计基础期中总结
  20. GPU巨头英伟达遭“​毁灭性”网络攻击、头号恶意软件关闭其僵尸网络基础设施|2月28日全球网络安全热点

热门文章

  1. Flutter侧边栏控件-SideBar
  2. Python——日历模块
  3. Typec转HDMI 4K30HZ扩展芯片方案CS5261和CS5266设计参数及电路对比
  4. shell 经典, shell 十三问
  5. 有向图中欧拉回路存在的充分条件及证明
  6. 拨号上网怎么修改dns服务器,dns怎么设置才能上网 dns设置上网方法【图文】
  7. 推荐25个上网必备的经典网站
  8. 【Hello Network】HTTP协议
  9. 网络基础配置部署思路
  10. canvas 多个图片叠加,图片覆盖图片显示到imageview