【位运算】【二分查找】【C++算法】100160价值和小于等于 K 的最大数字

news2025/2/26 9:53:38

作者推荐

【动态规划】【字符串】扰乱字符串

本文涉及的基础知识点

二分查找算法合集
位运算

LeetCode100160. 价值和小于等于 K 的最大数字

给你一个整数 k 和一个整数 x 。
令 s 为整数 num 的下标从1 开始的二进制表示。我们说一个整数 num 的 价值 是满足 i % x == 0 且 s[i] 是 设置位 的 i 的数目。
请你返回 最大 整数 num ,满足从 1 到 num 的所有整数的 价值 和小于等于 k 。
注意:
一个整数二进制表示下 设置位 是值为 1 的数位。
一个整数的二进制表示下标从右到左编号,比方说如果 s == 11100 ,那么 s[4] == 1 且 s[2] == 0 。
示例 1:
输入:k = 9, x = 1
输出:6
解释:数字 1 ,2 ,3 ,4 ,5 和 6 二进制表示分别为 “1” ,“10” ,“11” ,“100” ,“101” 和 “110” 。
由于 x 等于 1 ,每个数字的价值分别为所有设置位的数目。
这些数字的所有设置位数目总数是 9 ,所以前 6 个数字的价值和为 9 。
所以答案为 6 。
示例 2:
输入:k = 7, x = 2
输出:9
解释:由于 x 等于 2 ,我们检查每个数字的偶数位。
2 和 3 在二进制表示下的第二个数位为设置位,所以它们的价值和为 2 。
6 和 7 在二进制表示下的第二个数位为设置位,所以它们的价值和为 2 。
8 和 9 在二进制表示下的第四个数位为设置位但第二个数位不是设置位,所以它们的价值和为 2 。
数字 1 ,4 和 5 在二进制下偶数位都不是设置位,所以它们的价值和为 0 。
10 在二进制表示下的第二个数位和第四个数位都是设置位,所以它的价值为 2 。
前 9 个数字的价值和为 6 。
前 10 个数字的价值和为 8,超过了 k = 7 ,所以答案为 9 。
提示:
1 <= k <= 1015
1 <= x <= 8

二分查找

随着num的增加,价值和单调增加。这是二分查找的基础。寻找最后一个符合条件的nums,用左闭右开空间。
如何求1到num第i位的价值和。 由于0不包括1,所以本问题等效与0到num的价值和。

i==00 1周期长度2
i==100 01 10 11…周期长度4
i==2000 001 010 011 100 101 110 111…周期长度8

周期长度 1<<i 。前半个周期,全部是0,后半个周期全部是1。

[0,num]共num+1个数。

  • 完整周期数:(num+1)/(1 << i ) 每个周期有半数1
  • 不足一个周期的数有iCnt2= (num+1)%(1<<i) 1的数量为:iCnt2-- (i <<i )/2 iCnt如果小于0,取0.

代码

核心代码

这周的LeetCode C++可能有问题,总溢出,所以加了不少判断。

class Solution {
public:
	long long findMaximumNumber(long long k, int x) {
		long long left = 0, r = 5e17;
		while (r - left > 1)
		{
			const auto mid = left + (r - left) / 2;
			if (Cnt(mid, k,x) <= k)
			{
				left = mid;
			}
			else
			{
				r = mid;
			}
		}
		return left;
	}
	long long Cnt(long long mid,int k,int x )
	{
		long long llCnt = 0;
		for (int ii = x; ii <= 60; ii += x)
		{
			const long long tmp = 1LL << ii;//周期
			const long long cur1 = (mid + 1) / tmp * (tmp / 2);	
			const long long cur2 = max(0LL, (mid + 1) % tmp - tmp / 2);
			if (LLONG_MAX - llCnt < cur1)
			{
				return k + 1;
			}
			llCnt += cur1;
			
			if (LLONG_MAX - llCnt < cur2)
			{
				return k + 1;
			}
			llCnt += cur2;
		}
		return llCnt;
	}
};

测试用例

template<class T>
void Assert(const T& t1, const T& t2)
{
	assert(t1 == t2);
}

template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{
	if (v1.size() != v2.size())
	{
		assert(false);
		return;
	}
	for (int i = 0; i < v1.size(); i++)
	{
		Assert(v1[i], v2[i]);
	}
}


int main()
{
	
	long long k;
	int x;
	{
		Solution sln;
		k = 19, x = 6;
		auto res = sln.findMaximumNumber(k, x);
		Assert(50LL, res);
	}
	{
		Solution sln;
		k = 9, x = 1;
		auto res = sln.findMaximumNumber(k, x);
		Assert(6LL, res);
	}
	{
		Solution sln;
		k = 7, x = 2;
		auto res = sln.findMaximumNumber(k, x);
		Assert(9LL, res);
	}
	{
		Solution sln;
		k = 343883588590415, x = 1;
		auto res = sln.findMaximumNumber(k, x);
		//Assert(9LL, res);
	}	
}

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快

速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

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

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

相关文章

[书生·浦语大模型实战营]——XTuner 大模型单卡低成本微调

1.Finetune简介 在未经过微调的pretrained LLM中&#xff0c;模型只会尽量去拟合你的输入&#xff0c;也就是说模型并没有意识到你在提问&#xff0c;因此需要微调来修正。 1.1常用的微调模式 LLM的下游应用中,增量预训练和指令跟随是经常会用到的两种的微调模式。 增量预训练…

【前后端的那些事】解放后端!10min快速上手人人代码生成器(后端篇)

人人代码生成器【后端篇】 文章目录 人人代码生成器【后端篇】1. 克隆renren-generator2. 配置项目信息3. 配置数据库信息4. 启动项目5. 创建springboot项目5.1 pom.xml5.2 创建包结构5.3 编写application.yml5.4 将生成代码集成到项目中5.5 集成common模块5.6 启动项目 前言&a…

影响邮件打开率的因素有哪些?

影响邮件打开率得因素有很多&#xff0c;比如说邮件地址的有效性、邮件标题、定位人群、发送频率或者时间等因素。目前来讲&#xff0c;我们可以通过技术的手段改善邮件的到达率&#xff0c;但是邮件的打开率取决于收件人本身&#xff0c;所以发件人的发送动作如何在很大程度上…

一、Mindspore 公开课 - Transformer

课程链接&#xff1a;Mindspore 技术公开课 Transformer 论文地址&#xff0c;建议看完课程以后简单看看论文 前言 Transformer是一种神经网络结构&#xff0c;由Vaswani等人在2017年的论文“Attention Is All You Need” 中提出&#xff0c;用于处理机器翻译、语言建模和文…

PLAN B KRYPTO ASSETS GMBH CO. KG 普兰资产管理公司

引领加密技术不断演进 PLAN B KRYPTO ASSETS普兰资产管理以其独创的「Trident Strategy三叉戟模型」技术为基础&#xff0c;持续推动加密技术的发展&#xff0c;打造 Schutz&#xff08;舒茨盾&#xff09; AI 金融隐私匿名公链。致力于提供高效的技术服务&#xff0c;基于机构…

SqlAlchemy使用教程(三) CoreAPI访问与操作数据库详解

SqlAlchemy使用教程(一) 原理与环境搭建SqlAlchemy使用教程(二) 入门示例及编程步骤 三、使用Core API访问与操作数据库 Sqlalchemy 的Core部分集成了DB API, 事务管理&#xff0c;schema描述等功能&#xff0c;ORM构筑于其上。本章介绍创建 Engine对象&#xff0c;使用基本的…

「企业架构框架」什么是TOGAF?

什么是TOGAF&#xff1f;TOGAF开发概述什么是TOGAF上下文中的架构&#xff1f;什么是企业架构&#xff1f;TOGAF的结构介绍架构开发方法ADM指南和技术架构内容框架企业连续体和工具参考模型架构能力框架相关链接 什么是TOGAF&#xff1f; TOGAF由开放集团推出&#xff0c;是一种…

LangChain 71 字符串评估器String Evaluation衡量在多样化数据上的性能和完整性

LangChain系列文章 LangChain 60 深入理解LangChain 表达式语言23 multiple chains链透传参数 LangChain Expression Language (LCEL)LangChain 61 深入理解LangChain 表达式语言24 multiple chains链透传参数 LangChain Expression Language (LCEL)LangChain 62 深入理解Lang…

【STK】手把手教你利用STK进行关联分析仿真01-STK/CAT模块介绍

关联分析工具(Conjunction Analysis Tool )主要用于分析航天发射或卫星在轨运行过程中与其他目标之间的接近情况,关联分析包括: 接近分析工具 Close Approach Tool CAT高级接近分析工具 AdvCAT激光接近分析工具 LaserCAT发射窗口分析工具 Launch Window Analysis今天主要介绍…

RAG 评估框架 -- RAGAS

原文 引入 RAG&#xff08;Retrieval Augmented Generation&#xff09;的原因 随着ChatGPT的推出&#xff0c;很多人都理所当然直接用LLM当作知识库回答问题。这种想法有两个明显的缺点&#xff1a; LLM无法得知在训练之后所发生的事情&#xff0c;因此无法回答相关的问题存…

大面积光源HUD阳光倒灌实验装置太阳光模拟器

背景 1.根据现在市场上一些量产的hud的结构和原理可知&#xff0c;hud中最重要的零件之一就是凹面镜(自由曲面)&#xff0c;hud利用凹面镜放大投影的光学原理进行投影成像。当发生阳光倒灌时&#xff0c;太阳光沿着hud正常工作时成像的逆光路&#xff0c;通过挡风玻璃-凹面镜-…

4.【CPP】入门(初始化列表||explicit||static||友元||静态成员变量/函数)

一.初始化列表 1.引入 我们知道在c11中才能在成员对象声明时初始化&#xff0c;像下面这样。 class Date { public: Date(int year, int month, int day): _year(year), _month(month), _day(day) {} private: int _year2000; int _month12; int _day20; };注意&#xff1a;…

CMake tasks.json launch.json

hehedalinux:~/Linux/cmake/cmakeClass$ tree . ├── CMakeLists.txt ├── include │ ├── Gun.h │ └── Soldier.h ├── main.cpp └── src├── Gun.cpp└── Soldier.cpp2 directories, 6 files hehedalinux:~/Linux/cmake/cmakeClass$ launch.json&am…

每日一题——LeetCode1189.气球的最大数量

方法一 个人方法&#xff1a; 统计text字符串中b、a、l、o、n 这几个字符出现的次数 l和n需要两个才能拼成一个balloon&#xff0c;所以碰到l和o加1&#xff0c;其他字符加2 最后求出出现次数最少的那个字符再除以2就是能拼凑成的单词数量&#xff0c;避免出现小数要使用向下…

godot初学笔记

godot开发工具下载地址 godot下载地址 godot入门视频 godot入门教学b站地址 素材下载地址 素材下载地址 最终成品图 2D3D如何切换 添加2D场景 添加其他节点 添加人物节点 设置人物为接地 给人物添加Sprite 2d 给人物设置材质 解决材质糊的问题 设置材质包切割 在场景中实…

CISP注册信息系统安全认证,2024年1月20日即将开课~想了解点击查看

CISP注册信息系统安全认证 1&#x1f237;20日 开课~ 想报名的必须提前预约啦 &#x1f447;&#x1f447;&#x1f447; 课程介绍 本课程包括10个独立的知识域&#xff08;安全工程与运营、计算环境安全、软件安全开发、网络安全监管、物理与网络通信安全、信息安全保障、信…

杨中科 .NETCORE EFCORE 第一部分 基本使用

一 、什么是EF Core 什么是ORM 1、说明: 本课程需要你有数据库、SOL等基础知识。 2、ORM: ObjectRelational Mapping。让开发者用对象操作的形式操作关系数据库 比如插入: User user new User(Name"admin"Password"123”; orm.Save(user);比如查询: Book b…

自动粘贴文本:高效复制中国邮政编码,提升效率,释放创意

在快节奏的现代生活中&#xff0c;时间就是金钱&#xff0c;效率就是生命。中国邮政EMS&#xff0c;作为您的快递服务首选&#xff0c;一直致力于提供更加便捷、高效的寄递体验。今天&#xff0c;我们隆重推出全新功能——"自动粘贴文本"&#xff0c;让您轻松复制邮政…

test-02-test case generate 测试用例生成 EvoSuite 介绍

拓展阅读 junit5 系列 基于 junit5 实现 junitperf 源码分析 Auto generate mock data for java test.(便于 Java 测试自动生成对象信息) Junit performance rely on junit5 and jdk8.(java 性能测试框架。性能测试。压测。测试报告生成。) 拓展阅读 自动生成测试用例 什么…