程序员面试金典 - 面试题 05.04. 下一个数(线性扫描)

文章目录

    • 1. 题目
    • 2. 解题
      • 2.1 STL
      • 2.2 线性扫描
      • 2.3 位运算

1. 题目

下一个数。给定一个正整数,找出与其二进制表达式中1的个数相同大小最接近的那两个数(一个略大,一个略小)。

1:输入:num = 2(或者0b10)输出:[4, 1] 或者([0b100, 0b1])例2:输入:num = 1输出:[2, -1]提示:
num的范围在[1, 2147483647]之间;
如果找不到前一个或者后一个满足条件的正数,那么输出 -1

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/closed-number-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 类似题目:LeetCode 31. 下一个排列(线性扫描)

2.1 STL

  • prev_permutation\next_permutation,返回的是 bool 值,会改变原数组!!!
class Solution {
public:vector<int> findClosedNumbers(int num) {vector<int> n(32,0);int i = 31;while(num)//数字转成二进制存在数组里{n[i--] = num&1;num >>= 1;}vector<int> ans(2,-1);next_permutation(n.begin(),n.end());//会改变原数组long a = calnum(n);if(0 < a && a <= INT_MAX)ans[0] = a;prev_permutation(n.begin(), n.end());//上面next了一下,这里往回退2步prev_permutation(n.begin(), n.end());a = calnum(n);if(0 < a && a <= INT_MAX)ans[1] = a;return ans;}int calnum(vector<int>& num){long sum = 0;for(int i : num)sum = sum*2+i;return sum;}
};

0 ms 6.1 MB

2.2 线性扫描

  • 手写下一个排列、前一个排列
class Solution {
public:vector<int> findClosedNumbers(int num) {vector<int> n(32,0);int i = 31;while(num){n[i--] = num&1;num >>= 1;}vector<int> ans(2,-1);next_perm(n);long a = calnum(n);if(0 < a && a <= INT_MAX)ans[0] = a;prev_perm(n);prev_perm(n);a = calnum(n);if(0 < a && a <= INT_MAX)ans[1] = a;return ans;}void next_perm(vector<int>& n){int i = n.size()-2, j;while(i>=0 && n[i] >= n[i+1])i--;//找到下降点if(i>=0){j = i+1;while(j < n.size() && n[i] < n[j])j++;swap(n[i],n[j-1]);}reverse(n,i+1,n.size()-1);}void prev_perm(vector<int>& n){int i = n.size()-2, j;while(i>=0 && n[i] <= n[i+1])i--;//找到上升点if(i>=0){j = i+1;while(j < n.size() && n[i] > n[j])j++;swap(n[i],n[j-1]);}reverse(n,i+1,n.size()-1);}void reverse(vector<int>& n, int l ,int r){while(l < r)swap(n[l++],n[r--]);}int calnum(vector<int>& num){	//计算排列后的数值long sum = 0;for(int i : num)sum = (sum<<1)+i;return sum;}
};

4 ms 6.3 MB

2.3 位运算

  • bitset 存储各个位,注意 bitset 的位置是反的【0—n-1】对应【低位,。。。高位】
  • 一个排列从低往高找下降点,即找到 01–>10,高位变大,后面的低位变成[000… 111]最小
  • 一个排列从低往高找上升点,即找到 10–>01,高位变小,后面的低位变成[111… 000]最大
class Solution {
public:vector<int> findClosedNumbers(int num) {bitset<32> big(num);bitset<32> small(num);vector<int> ans(2,-1);int i, l, r;for(i = 1; i < 32; ++i)//next 找下降点{if(big[i-1] > big[i]){big.flip(i);big.flip(i-1);l = 0, r = i-1;while(l < r){while(l < r && big[l]==1)//高位的1全部挪到低位l++;while(l < r && big[r]==0)r--;big.flip(l++);big.flip(r--);}long a = big.to_ulong();if(a <= INT_MAX)ans[0] = a;break;}}for(i = 1; i < 32; ++i)//prev 找上升点{if(small[i-1] < small[i]){small.flip(i);small.flip(i-1);l = 0, r = i-1;while(l < r){while(l < r && small[l]==0)//低位的1全部挪到高位l++;while(l < r && small[r]==1)r--;small.flip(l++);small.flip(r--);}long a = small.to_ulong();if(a <= INT_MAX)ans[1] = a;break;}}return ans;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/476667.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

同花顺如何切换k线_K线之形态学:浅谈纸白银产品该如何去做好交易?

K线之形态学&#xff1a;浅谈纸白银产品该如何去做好交易&#xff1f;由于疫情期间&#xff0c;明显感觉到今年做投资理财的朋友多了&#xff0c;特别是银行的纸产品&#xff0c;我是分析外盘伦敦银伦敦金为主&#xff0c;自己也是只操作外盘产品。国内的不管是纸白银或者TD白银…

从NeurIPS论文来看,中美学者很少互相引用

源&#xff5c;机器之心想要改变这种情况还很难。不知从何时起&#xff0c;我们习惯了人工智能的学术顶会上中美研究数量排名前两位的形势。不论在工业还是学术上&#xff0c;两者很大程度上引领了技术的发展&#xff0c;中美的交流也非常密切&#xff1a;不少大厂都会在对面设…

[导入][导入][c#]Web开发中Tag的开发技巧

http://onewww.net/blog/article.asp?id87网站开发常用关键字(tag)&#xff0c;一般需要获得最多的被采用的Tag&#xff0c;也就是流行词。通常思路是将关键字tag保存到单独表中&#xff0c;然后在其他表中根据一组id进行对多个关键字进行标识。因为一个文章可以选择多个tag&a…

泰坦尼克号生存预测入门

文章目录1. 数据预览2. 特征初步选择3. 增加特征Sex和Embarked4. 选择随机森林调参5. 实践总结本文作为学习记录&#xff0c;参考 此处&#xff0c;如有侵权&#xff0c;联系删除。1. 数据预览 数据集下载 import pandas as pd import numpy as np from pandas import Series…

excel去重_数据处理之EXCEL的高效技巧分享

这是一个技巧贴&#xff0c;直接上干货&#xff1a;1、你想在excel中看到函数值是如何计算出来的&#xff1f;Ctrl~&#xff1a;进入函数视图2、去除重复值方式有哪些?a、数据—数据工具—删除重复值(以当前选定区域排序&#xff1a;只对选中区域去重&#xff1b;扩展选定区域…

泄露了 5.33 亿 Facebook 用户的个人资料后,Meta 被罚款 2.75 亿美元

文 | 兔子酱编 | 王思若大家好&#xff0c;我是兔子酱。多年前&#xff0c;Facebook曾被曝出一个大瓜——2018 年 5 月至 2019 年 9 月期间&#xff0c;不法分子利用 Facebook 的安全漏洞从 5.33 亿人的个人资料中窃取个人信息&#xff0c;包括电话号码、位置、电子邮件地址、生…

10月24日 多云

10月24号 多云 最近不知怎么了 突然很没有食欲 不到半夜不知道饿。 中午下楼吃饭&#xff0c;走了半天也不知道想吃什么&#xff0c;索性走进了一个菜市场&#xff0c;买了一个鸡架&#xff0c;打道回府。哦对了&#xff0c;路上还买了几个苹果&#xff0c;牙总出血&#xff0c…

程序员面试金典 - 面试题 04.09. 二叉搜索树序列(双端队列+回溯)**

1. 题目 从左向右遍历一个数组&#xff0c;通过不断将其中的元素插入树中可以逐步地生成一棵二叉搜索树。 给定一个由不同节点组成的二叉树&#xff0c;输出所有可能生成此树的数组。 示例: 给定如下二叉树2/ \1 3 返回:[[2,1,3],[2,3,1] ]来源&#xff1a;力扣&#xff08…

在央企做程序员是种什么体验?

源 | 程序厨今天在秀哥那里看到了这篇文章&#xff0c;个人感觉对一些想要进入央企的同学&#xff0c;有一些帮助&#xff0c;大家可以看一下&#xff0c;以下为正文。朋友校招加入了某垄断央企&#xff0c;在里面从事研发工程师的工作&#xff0c;下面将分享一些入职后的一些心…

pthread_create函数阻塞了主线程_5个状态,Python 中线程的生命周期

编 程 的 朝 圣 之 路----------------------------------------当程序中包含多个线程时&#xff0c;CPU 不是一直被特定的线程霸占&#xff0c;而是轮流执行各个线程。那么&#xff0c;CPU 在轮换执行线程的过程中&#xff0c;即从创建到消亡的整个过程&#xff0c;可能会历经…

ASP.NET AJAX入门系列(3):使用ScriptManagerProxy控件

在ASP.NET AJAX中&#xff0c;由于一个ASPX页面上只能有一个ScriptManager控件&#xff0c;所以在有母版页的情况下&#xff0c;如果需要在Master-Page和Content-Page中需要引入不同的脚本时&#xff0c;这就需要在Content-page中使用ScriptManagerProxy&#xff0c;而不是Scri…

程序员面试金典 - 面试题 16.04. 井字游戏(计数)

1. 题目 设计一个算法&#xff0c;判断玩家是否赢了井字游戏。输入是一个 N x N 的数组棋盘&#xff0c;由字符" "&#xff0c;“X"和"O"组成&#xff0c;其中字符” "代表一个空位。 以下是井字游戏的规则&#xff1a; 玩家轮流将字符放入空…

pygame render怎么显示中文_Pygame游戏——贪吃蛇(完结)

我们的贪吃蛇游戏基本功能已经实现&#xff0c;可以完成吃食物&#xff0c;吃到食物变长&#xff0c;得分增加&#xff0c;食物再次随机出现。但是我们有发现贪吃蛇可以穿到屏幕外面去&#xff0c;这显然是不合适的。这一次我们需要完善的是&#xff1a;游戏结束游戏结束后重新…

程序员面试金典 - 面试题 17.18. 最短超串(双指针+哈希)

1. 题目 假设你有两个数组&#xff0c;一个长一个短&#xff0c;短的元素均不相同。 找到长数组中包含短数组所有的元素的最短子数组&#xff0c;其出现顺序无关紧要。 返回最短子数组的左端点和右端点&#xff0c;如有多个满足条件的子数组&#xff0c;返回左端点最小的一个…

Symbian中不能跨越线程(RThread)使用的对象/组件(RSocket/Memery Heap,etc)

在Symbian C的编程中&#xff0c;出现一很多与Windows/linux用法与概念不同的东西。 首先&#xff0c;在Symbian中不建议多线程&#xff0c;因为线程的开销&#xff0c;也因为线程之间有很多东西不能传递与共享&#xff08;虽然同一进程中不同线程也是在同一个地址空间中&#…

Diffusion卷向视频,谷歌CEO劈柴亲自“带货”

源&#xff5c;机器之心编&#xff5c;张倩、杜伟谷歌、Meta 等科技巨头又挖了一个新坑。在文本转图像上卷了大半年之后&#xff0c;Meta、谷歌等科技巨头又将目光投向了一个新的战场&#xff1a;文本转视频。上周&#xff0c;Meta 公布了一个能够生成高质量短视频的工具——Ma…

pmp知识点详解-项目大牛整理_PMP核心知识点—第四章:项目整合管理(一)

文章来源&#xff1a;科科过PMP作者&#xff1a;科科过PMP由知乎号“慧翔天地PMP”推荐如有侵权请联系小编看到后第一时间处理一、制定项目章程1Inputs⑴商业文件→商业论证&#xff1a;①记录项目目标以及项目对目标的贡献②决定项目的期望结果是否值得所需投资③包含商业需求…

程序员面试金典 - 面试题 17.15. 最长单词(排序+递归)

1. 题目 给定一组单词words&#xff0c;编写一个程序&#xff0c;找出其中的最长单词&#xff0c;且该单词由这组单词中的其他单词组合而成。 若有多个长度相同的结果&#xff0c;返回其中字典序最小的一项&#xff0c;若没有符合要求的单词则返回空字符串。 示例&#xff1a…

.net 2.0 制作 柱状图

最近项目需要用到图表,饼图,柱状图&#xff0c;这些都很常用&#xff0c;在网上找了下&#xff0c;不是自已要的&#xff0c;只好自已动手做个,先做了个柱状图,先看下效果图代码有详解下载代码 此代码在winform环境下编译通过,要用在web环境也简单&#xff0c;只需将Graphics对…

不卷大厂了,78位高校青年教师晒出工资

源&#xff5c;青塔人才综合自知乎、小红书今天&#xff0c;小编给大家搜罗了江苏、浙江、上海、广东、山东、北京、福建、广西、云南、陕西、川渝、中部、东北地区78位高校教师的薪资待遇&#xff0c;欢迎转发分享&#xff5e;江苏常四荒&#xff1a;普通高校&#xff0c;讲师…