如何把一个数字x最右侧那个1拿出来,变成00...10..的格式
如何把一个数字x最右侧那个1拿出来,变成00…10…的格式
提示:异或运算重要知识点系列文章
只要了解异或运算的根本知识点,解决这些问题也就不在话下。
(1)认识异或运算的本质与基本规律,0^x=x,x异或x=0,有交换律,结合律,与顺序无关
(2)数组arr中,有一个数k出现了奇数次,其他数出现偶数次,请找到并打印这个数k
文章目录
- 如何把一个数字x最右侧那个1拿出来,变成00...10..的格式
- @[TOC](文章目录)
- 题目
- 一、审题
- 二、解题
- 暴力解
- 异或运算最优解o(1)
- 总结
题目
如何把一个数字x最右侧那个1拿出来,变成00…10…的格式
一、审题
示例:x=110100
获取最右侧那个1
ans = 000100
二、解题
暴力解
你可以这么做,比如将arr转换为字符数组
x=1 1 0 1 0 0
然后令ans=“”,为一个空字符串
待会遍历字符数组x
(1)i从N-1–0遍历
没有遇到1,则str+=" “;加空格
(2)一旦遇到第一1:
让str+=“1”;
然后剩下的位置i全部str+=” ";加空格
不好意思,有事o(n)的复杂度,如果N趋近于10^8,而最右边那个1巧了就是第一1位,其余全都是0,你惨了!!
暴力解失效了!
异或运算最优解o(1)
既然是数字中操作哪个位置的1,往往又要敏感地想到,这是异或运算可以干的事情,反正都是涉及二进制位的操作
这里直接硬核记一个结论: 下面是与x,不是异或哦
获取数字x最右侧1的办法:让x取反加1再与x
获取数字x最右侧1的办法:让x取反加1再与x
获取数字x最右侧1的办法:让x取反加1再与x
举例:x=110100
ans=000100
之所有取反+1,实际就是为了把x最右侧那个1,给它暴露出来,1以前就直接真的被取反了,但是咱还得把1和后面那些个0保留
故,x取反再加1呢,进位到最后把最后边那个1暴露了,后面都是0
再让一个最右侧位10000,的前面都取反了的数,与x,岂不是后面保留了,前边相反的数与一下,都为0了!
整个算目标就达成了,拿到了最右侧那个1
手撕代码,就一句话的事儿:复杂度o(1)
而且位运算,速度比四则运算快多了!!!能用位运算解决问题,一定是面试官欣赏的高手!!!
//怎么提取一个数中最右侧的1来,比如101010000100中倒数第二个1//公式:N&(~N+1):N取反加1再与自己——这里貌似和异或没关系public static void eorGetRightest1(){int N =10;String str10 = Integer.toBinaryString(10);//Java中无法表示二进制数,只能靠字符串表示System.out.println(str10);int rightest1 = N&((~N)+1);//不是异或,而是与&String str2 = Integer.toBinaryString(rightest1);System.out.println(str2);}
总结
提示:重要经验:
1)就记住一个结论,想获取x最右侧那个1,直接让x取反+1再与x就行
2)异或运算很经典的,非常有用,本文开头推荐写基础知识一定要掌握
如何把一个数字x最右侧那个1拿出来,变成00...10..的格式相关推荐
- 3D Touch介绍: 一个数字压力器App和Quick Actions
随着iPhone 6s and 6s Plus的发布,苹果介绍了全新的手机交互方式:重按手势.你应该知道,这个特性其实早已应用在苹果手表和MacBook产品中,名字叫Force Touch.它给用户交 ...
- 用户输入一个数字,找到所有能够除尽它的数的总个数
想不到我这个小学生也会做 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...
- 一个数字键盘引发的血案——移动端H5输入框、光标、数字键盘全假套件实现...
https://juejin.im/post/5a44c5eef265da432d2868f6 为啥要写假键盘? 还是输入框.光标全假的假键盘? 手机自带的不用非得写个假的,吃饱没事干吧? 装逼?炫技 ...
- ACMNO.13求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字。 输入 n 输出 和 样例输入 5 样例输出 153
题目描述 求Sn=1!+2!+3!+4!+5!+-+n!之值,其中n是一个数字. 输入 n 输出 和 样例输入 5 样例输出 153 来源/分类 C语言 题目截图: 思路: 首先要想到使用两个for循 ...
- ACMNO.9求Sn=a+aa+aaa+…+aa…aaa(有n个a)之值,其中a是一个数字。 例如:2+22+222+2222+22222(n=5),n由键盘输入。 输入 n 输出 a=2 时
题目描述 求Sn=a+aa+aaa+-+aa-aaa(有n个a)之值,其中a是一个数字. 例如:2+22+222+2222+22222(n=5),n由键盘输入. 输入 n 输出 a=2 时的Sn 样例 ...
- edgeR:一个数字基因表达数据差异表达分析Bioconductor程序包
edgeR:一个数字基因表达数据差异表达分析Bioconductor程序包 人们希望在不久的将来,对于许多功能基因组学应用,新兴的数字基因表达(digital gene expression,DGE) ...
- 猜数字游戏:随机键盘录入一个数字,看是否能猜正确
package com.summer.cn;import java.util.Scanner;public class Test041505 {public static void main(Stri ...
- MODE —— 输入一个数字,求从1加到该数的和(知识点:for循环嵌套while循环)
问题描述: 终端输入一个数字,求从1加到这个数字的和! 运行结果: 代码部分: #include <stdio.h> int main() {unsigned int sum = 1UL; ...
- 自动化测试(三)如何用python写一个函数,这个函数的功能是,传入一个数字,产生N条邮箱,产生的邮箱不能重复。...
写一个函数,这个函数的功能是,传入一个数字,产生N条邮箱,产生的邮箱不能重复.邮箱前面的长度是6-12之间,产生的邮箱必须包含大写字母.小写字母.数字和特殊字符 和上一期一样 代码中间有段比较混沌 有 ...
最新文章
- extract_first()
- NSNotificationCenter
- 常见的垃圾回收器算法有哪些,各有什么优劣?
- python解释器有多大_python解释器到底是什么?
- 编译原理第一次上机作业感想
- loj136 (最小瓶颈路,多次询问)
- C语言编译-嵌入式系统
- vue slot的使用介绍
- PCL1.8.0 error C4996: 'pcl::SAC_SAMPLE_SIZE'编译错误
- 12.51单片机实现电子音乐盒
- 计算机图形点阵表示实例,计算机图形学的应用实例(计算机图形作业)精选.doc
- 桥本分数式c语言,《算法设计与分析教案(新格式)》.doc
- 华为手机照片如何出现时间地点天气,教你30秒,一学就会
- c语言 运行结果是空白的,为什么输出是空白
- Python模拟Tim登录界面
- 函数名和变量名重名问题
- 【NOIP2018 模拟赛04.14】 陪审团
- 怎么关闭excel出现的microsoft office 自定义安装程序提示
- 2021 ICPC Southeastern Europe Regional Contest 树上dfs+思维
- 谁能做到电商平台的公平性,谁就是下一任电商老大?