算法题_位运算_9_出现一次的数字和出现k次的数字

蓝桥云课《算法很美》1.8 1.9出现k次与出现1次 目录题目思路代码 题目 数组中只有一个数出现了1次,其他的数都出现了k次,请输出只出现了1次的数。 思路 解析:把十进制的数转化为k进制,k个k进制的数进行不进位相加,结果是0;那么剩下的就是那个出现一次的数。 eg:有10个11进行相加,原本1*10=10,原本应该进位的1舍去,就只能剩下0了。 代码 public class _07_出现k次 { public static void main(String[] args) { // TODO Auto-generated method st 阅读详情

位运算

出现一次的数字和出现k次的数字

题目:出现k次和出现1次
描述:数组中只有一个数出现了1次,其他的数都出现了k次,请输出只出现1次的数。

第一次看到这道题,思考了一会,觉得可以使用Map集合来做,实在想不到怎么用位运算来解决,后来同学说可以使用"不进位加法"来做,这也是用"位运算"解题的核心,因此,在此记录一下两种解法。

1、解法1(位运算)

在上面,我们提到了"不进位加法",在解题之前,我们先补充一个知识。

如果2个相同二进制数做不进位的加法,如10+10,其结果为多少呢?很显然是:0。

那如果是10个相同十进制的数做不进位加法呢?如10个2,显然还是0。

因此我们可以得出一个小结论:k个相同的k进制数做不进位加法,其结果为0。

解法1:将所有数转为k进制,然后进行不进位的加法,最后,其结果只剩出现1次的数,再转为十进制输出即可。
    1、转为k进制
    	1.1、如何转?Java中有封装好的Integer.toString(int i, int radix)
    2、不进位加法
    	2.1、将转化的k进制数的每一位存放至二维数组中
    	2.2、遍历二维数组,将每一列做和的结果存放至另外一个整型数组中
    	2.3、遍历整型数组,对每一个元素进行取模运算,以达到不进位加法的效果
    	2.4、转化为十进制后进行累加,输出的值就为出现1次的数的值。

在这里插入图片描述

/**
 * 获取出现一次的数字
 * 解法1:位运算
 *
 * @param nums 数组
 * @param k    几个相同的数
 * @return 若存在,则返回该数
 */
public static int getOnceNumByBitOperate(int[] nums, int k) {
    //数组的长度
    int length = nums.length;
    //用二为数组来存放nums数组元素转化为k进制数的每一位
    char[][] kRadix = new char[length][];
    //转成k进制字符数组
    int maxLen = 0;
    for (int i = 0; i < length; i++) {
        /*
         * Integer.toString(nums[i], k):转化为k进制数
         * .reverse():将k进制字符串反转,例如21则反转为12。
         * .toString():转化为字符串
         * .toCharArray():将字符串转化为字符数组
         */
        kRadix[i] = new StringBuilder(Integer.toString(nums[i], k)).reverse().toString().toCharArray();
        if (kRadix[i].length > maxLen) {
            //记录最长的列,后面遍历会用到
            maxLen = kRadix[i].length;
        }
    }
    /*
     * 此数组用于存放每一个比特位做完不进位的和
     * 实际上,这里就是做了普通的加法而已,后面会对这个和进行取余操作,等价于不进位加法的效果。
     */
    int[] resArr = new int[maxLen];
    //不进位加法
    for (int i = 0; i < length; i++) {
        for (int j = 0; j < maxLen; j++) {
            /* 如果j大于等于二位数组某一行的长度时,则+0即可。
             * j >= kRadix[i].length 也可写为 (j+1) >= kRadix[i].length
             */
            if (j >= kRadix[i].length) {
                resArr[j] += 0;
            } else {
                /*
                 * 为何要减去'0'?
                 * 因为,resArr是int类型,而kRadix数组是字符类型
                 * '0'的十进制ASCII码为48,若没有减去'0',则会存在48的误差,比如2-0 = 0,但是 2-'0' = 2-48 = -46
                 */
                resArr[j] += (kRadix[i][j] - '0');
            }
        }
    }
    int res = 0;
    //遍历数组,拿到每个位做完加法的结果
    for (int i = 0; i < maxLen; i++) {
        /* %k:取模运算,相当于完成不进位加法的效果
         * * (int) (Math.pow(k, i)):转化为十进制
         */
        res += (resArr[i] % k) * (int) (Math.pow(k, i));
    }
    return res;
}

2、解法2(Map集合)

解法2:Map集合
    1、创建一个HashMap,键Key用来保存数组元素,值Value用来记录数组元素出现的次数
    2、遍历数组,判断Map的键是否存在
    	2.1、存在,则获取其值value,加1后
    	2.2、不存在,直接将值value设置为1
    3、遍历Map,获取所有的键key,再通过键拿到其值value
    	3.1、判断值value是否为1,若是则输出键key
/**
     * 获取出现一次的数字
     * 解法2:Map集合
     *
     * @param nums 数组
     * @return 若存在,则返回该数;反之,返回-1
     */
    public static int getOnceNum02(int[] nums) {
        Map<Integer, Integer> map = new HashMap<>(nums.length);
        //2、遍历数组
        for (int num : nums) {
            if (map.containsKey(num)) {
                //2.1、存在
                int value = map.get(num);
                map.put(num, ++value);
            } else {
                //2.2、不存在
                map.put(num, 1);
            }
        }
        //3、遍历Map
        Set<Integer> keySet = map.keySet();
        for (Integer key : keySet) {
            //存在,返回key,即出现一次的数
            if (map.get(key) == 1) {
                return key;
            }
        }

        //不存在返回-1
        return -1;
    }

注:解法1可能比解法2晦涩难懂,效率也差,但是我认为解法1的思想还是值得学习的。


调试结果:

public static void main(String[] args) {
    //假设出现了k次
    int[] nums = new int[]{3, 3, 3, 9, 6, 6, 6, 8, 8, 8, 10, 10, 10};
    System.out.println("(位运算)出现一次的数:" + getOnceNumByBitOperate(nums, 3));
    System.out.println("(Map集合)出现一次的数:" + getOnceNumByMap(nums));
}

在这里插入图片描述


如有错误,敬请指正!

出现k次与出现1次,二进制中有几个1 题目1: 数组中只有一个数出现了一次其他数均出现k次,求出出现一次的数 算法思想与代码写一起了,见注释 public class 出现k次与1次 { /* * 【当k为偶数奇数都适用】 * 算法思想: * 1,把所有的数字转化为k进制 * 2,让转化后的数每一相同的位相加 * 3,每一位相加后的数除k取余得到一个k进制的数 * 4,将该数转化为十进制即可输出 */ public static void main(String[] args) { int [] arr={2,2,2,2,3,3,3,3,6,6,6,6,9,9,9,9,8,8,8,8,7,5,5,5 立即下载

相关推荐

深入解析STM32官方库:.c/.h文件功能与应用场景

本文深入解析了STM32官方库中.c和.h文件的核心功能与应用场景。详细剖析了stm32f10x.h、启动文件、外设驱动文件等关键组件的作用,并通过LED闪烁实战演示了如何构建工程、配置文件和调用库函数。文章旨在帮助开发者理解官方库的架构,掌握高效使用技巧,从而降低STM32开发门槛,提升开发效率与代码质量。

weixin_29189377的博客 347

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

出现一次与出现k次的数,分别使用hashMap和不进位加法两种解法,超详细,每句代码都有注释!!!

黑虎阿福的博客 535

cocos creator接入微信登陆sdk ios篇

cocos creator接入微信登陆sdk ios篇 背景已经在Android篇里面交代过了,有兴趣的朋友可以再看看Android篇 步骤 去微信开放平台下载ios平台所需要的sdk 在“info”标签栏的“URL type“添加“URL scheme”为你所注册的应用程序id 在“info”标签栏的“LSApplicationQueriesSchemes“添加weixin 将SDK文件中...

凤小鹿的博客 6362

题7:出现k次与出现1次

数组中只有一个数出现了一次,其他的数都出现了k次。请输出只出现一次的数。 两种情况: (1)若k为偶数,直接进行异或,得到的结果为出现一次的数。 (2)若k为奇数,采用不进位加法计算。原理:k个相同的k进制数做不进位加法结果为0。 package com; public class 出现K次和出现1次 { public static void main(String[] args) { int []arr = {2,2,2,9,7,7,7,3,3,3,6,

m0_66279156的博客 450

Unity XR Interaction Toolkit(二)手柄交互

XR Interaction 手柄事件和抓取设置

qq_36608844的博客 8494

14、多级快速多极子算法(MLFMA)详解

多级快速多极子算法(MLFMA)是一种高效加速矩阵向量乘法(MVM)的数值方法,广泛应用于电磁场积分方程求解中。该算法通过构建多级树结构,将MVM分解为近场直接计算和远场分组计算两部分,利用递归聚类、聚合-平移-分解三阶段处理远场相互作用,并结合采样、模式计算与优化策略,将计算复杂度从O(N^2)降低至O(N log N)。博文详细阐述了MLFMA的核心步骤、数学推导、计算复杂度及实际应用中的优化技术,如伽辽金方案改进、对称性利用和反插值方法,为大规模电磁问题的高效求解提供了系统性指导。

t8u9v0w1x的博客 241

【leetcode】在每个数字都出现K次的数组中,找只出现一次的数(思路服了)

题目如下:Given an array of integers, every element appears three times except for one. Find that single one.Note:Your algorithm should have a linear runtime complexity. Could you implement it without usin...

山鬼谣弋痕夕的博客 2035

【个人成长笔记】在Ubuntu中安装RTL8188GU USB无线网卡驱动(Driver for Linux RTL8188GU)

这篇笔记提供了在Ubuntu系统中安装RTL8188GU无线网卡驱动的完整指南。主要内容包括:驱动程序的官方来源(Github链接)、详细安装步骤(通过git下载、编译安装等命令),以及将设备转换为USB网卡模式的关键指令。特别提醒每次开机都需要执行模式转换命令,因为设备默认会以U盘模式启动。文章以简洁的技术文档形式呈现,适合Linux用户快速查阅和操作。

yuhuasheng1997的博客 1823

Java算法--第一章--位运算符(8)出现k次与出现1次

Java算法–第一章–位运算符(8)出现k次与出现1次 题目:数组中只有一个数出现了1次,其他的数都出现了k次,请输出只出现了1次的数。 补充知识点:(1)2个相同的二进制数做不进位加法,结果为零; (2)10个相同的十进制数做不进位加法,结果位零; (3)k个相同的k进制数做不进制加法,结果为零 代码: package exer1; public class 出现k次和出现1次 { public static void main(String[] args) { int[] ar

wp_886的博客 335

SAP AI Core 高阶能力实战参考

文章摘要:本文探讨了在企业SAP架构中整合GenAI技术的工程化实践,重点分析了SAP AI Core的高阶能力应用。作者指出,企业级AI应用需解决多轮对话管理、Git同步工作流、提示词治理等核心问题,而非简单接入大模型API。技术方案展示了如何通过SAP AI Core的orchestration service管理对话历史,利用GitOps实现AI资产版本控制,并强调prompt template在审计合规中的治理价值。全文以SAP技术栈(ABAP/RAP/Fiori)为背景,阐释了AI能力与企业核心系

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 103

【数字孪生与仿真技术】05:从原理到实战:MATLAB/Simulink在航空航天GNC系统开发中的深度解析(含全流程代码与认证指南)

摘要:本文系统阐述MATLAB/Simulink在航空航天制导、导航与控制(GNC)系统开发中的核心应用。通过解析GNC系统高保真动力学建模、多源导航传感器融合、鲁棒控制算法设计等关键技术原理,结合Virgin Orbit运载火箭、CubeSat等真实案例,展示从需求分析、模型搭建、仿真验证到代码生成与认证的完整开发流程。文中提供1200余行关键代码、8个可复用Simulink模型及详细执行结果展示,涵盖DO-178C认证支持、实时性能优化等工业级开发规范,为航空航天工程师、科研人员提供可落地的参考方案。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1656

算法训练之位运算

位运算题目练习

2401_82924480的博客 980

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

java实现 一个数组中只有一个数仅出现了一次,剩下的都出现了K次,求只出现了一次的那个数

此题我用的是位运算求解,实际上也可以用哈希表,构成键值对求解~ 步骤都在注释里,有问题欢迎留言交流 忽略类名…实在想不到啥英语 public class JinZhiMiaoYong { public static void main(String[] args) { /** * 思路: * 1)将数组中的每一个数转换为K进制 * 2)逐个相加。因为是不进位加法,所以需要...

菜鸟的进阶之路 635

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

7 道高频面试算法题,你都会了吗?「矩阵 + 位运算 + LRU」

矩阵 螺旋矩阵 给定一个包含 m x n 个要素的矩阵,(m 行, n 列),按照螺旋顺序,返回该矩阵中的所有要素。 public List<Integer> spiralOrder(int[][] matrix) { ArrayList<Integer> rst = new ArrayList<Integer>(); if(matrix...

圆号本号 1533

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【Leetcode算法题】268. 丢失的数字

给定一个包含[0, n]中n个数的数组nums,找出[0, n]这个范围内没有出现在数组中的那个数。2n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。2n = 2,因为有 2 个数字,所以所有的数字都在范围 [0,2] 内。2 是丢失的数字,因为它没有出现在 nums 中。8n = 9,因为有 9 个数字,所以所有的数字都在范围 [0,9] 内。8 是丢失的数字,因为它没有出现在 nums 中。

m0_56134369的博客 1640

刷题9-只出现一次的数字

刷题9-只出现一次的数字 解题思路:先把这个数组按从小到大的顺序排序,然后比较最近两个元素是否相等,相等的话就比较下下个元素 核心代码: 题目二-前n个数字二进制中1的个数 思路:应该是比较笨但思路比较清晰的方法 十进制数首先转化为二进制数,然后再判断二进制数字中’1’的个数 或者利用书上的解题思路i&(i-1),将整数i的最右边的1变为0; 第二种,把i分为奇数和偶数 若i为偶数,则i和i/2(i>>1)的二进制形式中1的个数是相同的。 若i为奇数,则比i/2的1的个数多1.

娄零的博客 146

力扣刷题系列——位运算篇

几道常见的位运算算法题 以下均为接触的力扣原题,作一个总结,以便日后复习。 1.不用加号的加法 设计一个函数把两个数字相加。不得使用 + 或者其他算术运算符。 示例: 输入: a = 1, b = 1 输出: 2 提示: 1)a,b均可能是负数或 0 2)结果不会溢出 32 位整数 关键点: 1、 a^b 计算没有进位的加法结果 2、 a&b 计算所有进位的位,左移再亦或就是进一位的结果,以此类推 代码实现: class Solution { public...

qq_43568704的博客 1553

算法基础 典型题 位运算

位运算的所有规则(与 / 或 / 异或 / 移位)都是针对 “二进制位” 定义的。

runafterhit的博客 795

位运算:最大K值

位运算中或的相关知识

m0_65163985的博客 420

给定一个二进制矩阵a JAVA_面试必备:高频算法题终章「图文解析 + 范例代码」之 矩阵 二进制 + 位运算 + LRU 合集...

Attention秋招接近尾声,我总结了 牛客、WanAndroid 上,有关笔试面经的帖子中出现的算法题,结合往年考题写了这一系列文章,所有文章均与 LeetCode 进行核对、测试。欢迎食用本文将覆盖 「二进制」 + 「位运算」 和 Lru 方面的面试算法题,文中我将给出:面试中的题目解题的思路特定问题的技巧和注意事项考察的知识点及其概念详细的代码和解析开始之前,我们先看下会有哪些重点案例:为...

weixin_39612554的博客 427

算法学习-位运算以及进制表示有关的问题,让脑袋像机器一样思考得到光荣进化(持续更新中)

作为计算机专业的学生,对于各种二进制表示数的方法需要具备一定的敏感性,但是每次碰到相关的题目或者算法题,却总是不能第一时间反应出来,因此本专题对相关题目进行整理汇总,让自己的脑子具备“二进制思维”。....................................

蒋大钊的博客 368

[贪心+数学/数学+位运算] 两种方法O(1)解决 消减整数

[贪心+数学/数学+位运算] 两种方法O(1)解决 消减整数 ,数学方法与位运算

石墨博客 1173

寒假打卡计划(2/9)

知识点:数组、前缀和、哈希表。

weixin_72162790的博客 1811

小浩算法-java题解(位运算篇)

小浩算法-java题解-位运算篇位运算篇连续n个数的和第231题:2的幂第191题:位1的个数第136题:只出现一次的数字第137题:只出现一次的数字Ⅱ第268题:缺失数字 原文链接 https://www.geekxh.com/0.0.%E5%AD%A6%E4%B9%A0%E9%A1%BB%E7%9F%A5/01.html 这里是把这个大佬的题解用java写一下做个记录 位运算篇 连续n个数的和 求 1 2 … n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及

酸菜鱼翻身历程 445

【LintCode: 3. 统计数字】算法题解析

这是一道来自LintCode的算法题目,本文用C++来解答这道题,链接为: https://www.lintcode.com/problem/digit-counts/description 题目描述 计算数字k在0到n中的出现的次数,k可能是0~9的一个值。 样例 例如n=12,k=1,在 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ...

weixin_34234829的博客 91
上一篇: 算法题_位运算_8_交换两个整数变量的值
下一篇: 基于Spring Boot的简易版新闻管理系统
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

窝在角落里学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值