【数论】【分类讨论】【C++算法】1611使整数变为 0 的最少操作次数

news2024/11/14 22:03:42

作者推荐

【动态规划】【字符串】【行程码】1531. 压缩字符串

涉及知识点

数论 数学 分类讨论

LeetCoce1611. 使整数变为 0 的最少操作次数

给你一个整数 n,你需要重复执行多次下述操作将其转换为 0 :
翻转 n 的二进制表示中最右侧位(第 0 位)。
如果第 (i-1) 位为 1 且从第 (i-2) 位到第 0 位都为 0,则翻转 n 的二进制表示中的第 i 位。
返回将 n 转换为 0 的最小操作次数。
示例 1:
输入:n = 3
输出:2
解释:3 的二进制表示为 “11”
“11” -> “01” ,执行的是第 2 种操作,因为第 0 位为 1 。
“01” -> “00” ,执行的是第 1 种操作。
示例 2:
输入:n = 6
输出:4
解释:6 的二进制表示为 “110”.
“110” -> “010” ,执行的是第 2 种操作,因为第 1 位为 1 ,第 0 到 0 位为 0 。
“010” -> “011” ,执行的是第 1 种操作。
“011” -> “001” ,执行的是第 2 种操作,因为第 0 位为 1 。
“001” -> “000” ,执行的是第 1 种操作。
提示:
0 <= n <= 109

数论

两种方式其实是一种:
如果是最低位,可以翻转。
如果有一位比它低,后边必须是1。
如果有两位比它低,后边必须是10。
如果有三位比它低,后边必须是100。

消除高位时,比它低的位必须是指定值。先低位后高位没有好处。所以先处理最高位。
分以下情况:
一,0,1。直接n。
二,n只有一个二进制位是1。这1后面的0转成1…0…。在将这个1消掉。
三,只有2个1,且挨着一起,消掉高位的1。
四,2个1,不挨着。低位1的前一位变成1,自身变成0。
五,2个以上1,除1的最高位和次高位,其它全为0。

翻转是可逆的,所以a到b和b到a的操作次数完全一样。

代码

核心代码

class Solution {
public:
	int minimumOneBitOperations(int n) {
		return Rec(n);
	}
	int Rec(int n)
	{
		if (n <= 1)
		{
			return n;
		}
		if (m_data.count(n))
		{
			return m_data[n];
		}
		int iLowBit = n & (-n);
		 int iOther = n - iLowBit;
		if (0 == iOther)
		{//只有一位是1: 0变成n/2后 ,将iLowBit消掉,变成n/2,变成0。 n1 变成n2和n2变成需要的步骤完全一样,逆运算,成立。
			return m_data[n] = Rec(n / 2) + 1 + Rec(n / 2);
		}
		if (iLowBit * 2== iOther)
		{//只有两个1,且挨着一起,方式二消除
			return	m_data[n] = 1 + Rec(n - 2*iLowBit);
		}
		while (iOther & (iOther - 1))
		{
			iLowBit = iOther & (-iOther);
			iOther -= iLowBit;
		}
		const int iNew = iOther + iLowBit;
		if (iNew == n)
		{
			return m_data[n] = 1 + Rec(iOther + iLowBit * 2) + Rec(iLowBit);
		}
		return m_data[n] = Rec(n - iNew) + Rec(iNew);
	}
	unordered_map<int, int> m_data;
};

## 测试用例

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()
{	
	vector<int> balls;
	
	{
		Solution sln;
		vector<int> nums = {3,6,2,4,5,7};
		vector<int> ans = {2,4,3,7,6,5};
		vector<int> ret;
		for (const auto& n : nums )
		{
			ret.emplace_back(sln.minimumOneBitOperations(n));
		}
		Assert(ret, ans);
	}


	
}

2023年2月

class Solution {
public:
int minimumOneBitOperations(int n) {
if (n < 2)
{
return n;
}
if (m_n.count(n))
{
return m_n[n];
}
int iMaxBitValue = GetMaxBitValue(n);
const int iDest = iMaxBitValue >> 1;
const int iSrc = n - iMaxBitValue;
return m_n[n] = Change2(iSrc, iDest) + 1 + minimumOneBitOperations(iDest);
}
int Change2(int iSrc, int iDest)
{
if (iSrc == iDest)
{
return 0;
}
if (1 == iDest)
{
return 1;
}
if (m_change2[iSrc].count(iDest))
{
return m_change2[iSrc][iDest];
}
if (iSrc & iDest)
{
return minimumOneBitOperations(iSrc - iDest);
}
const int iRet = 1 + Change2(iSrc, iDest >> 1) + minimumOneBitOperations(iDest >> 1);
return m_change2[iSrc][iDest] =iRet;
}
inline int GetMaxBitValue(int n )
{
int iMaxBitValue = n;
while (iMaxBitValue&(iMaxBitValue - 1))
{
iMaxBitValue = iMaxBitValue&(iMaxBitValue - 1);
}
return iMaxBitValue;
}
std::unordered_map<int, int> m_n;
std::unordered_map<int, std::unordered_map<int, int>> m_change2;
};

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步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/1420559.html

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

相关文章

多线程c++

目录 1.join和detach区别 2.lock_guard和unique_lock 3.原子操作 4.条件变量condition_variable 5.future 和 promise 1.join和detach区别 ①不使用join和detach #include <iostream> #include <thread> #include <windows.h>using namespace std;v…

Tensorflow2.0笔记 - tensor的padding和tile

本笔记记录tensor的填充和tile操作&#xff0c;对应tf.pad和tf.tile import tensorflow as tf import numpy as nptf.__version__#pad做填充 # tf.pad( tensor,paddings, modeCONSTANT,nameNone) #1维tensor填充 tensor tf.random.uniform([5], maxval10, dtypetf.int32) pri…

知识点积累系列(四)Kubernetes篇【持续更新】

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 知识点积累 系列文章的第四篇&#xff0c;记录日常学习中遇到的 Kubernetes 相关的知识点 1.Kubernetes琐碎知识点 1.1.为什么要有annotations annotation中除了能够记录一些额外信息&#xff0c;还可以解决k…

3d模型上的材质怎么删除---模大狮模型网

在大多数3D软件中&#xff0c;可以通过以下步骤来删除3D模型上的材质&#xff1a; 选择要删除材质的模型&#xff1a;首先&#xff0c;从场景中选择包含目标材质的模型。可以使用选择工具或按名称查找模型。 进入编辑模式&#xff1a;将模型切换到编辑模式。这通常需要选择相应…

【Docker】WSL(Windows Subsystem for Linux)常见命令解释说明以及简单使用

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Docker容器》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…

设计模式学习笔记02(小滴课堂)

江湖传言里的设计模式-单例设计模式 单例设计模式中的懒汉方式实战 这种方式是线程不安全的&#xff0c;多个线程同时调用会创建多个对象。 所以我们就要给它加锁: 我们去测试一下&#xff1a; 因为构造函数已经私有化&#xff0c;所以不能直接用new的方式去创建对象。 现在我…

多线程事务如何回滚?

背景介绍 1&#xff0c;最近有一个大数据量插入的操作入库的业务场景&#xff0c;需要先做一些其他修改操作&#xff0c;然后在执行插入操作&#xff0c;由于插入数据可能会很多&#xff0c;用到多线程去拆分数据并行处理来提高响应时间&#xff0c;如果有一个线程执行失败&am…

Stable Diffusion web UI 安装、启动脚本、常见问题、插件(linux)

Stable Diffusion本身是一个模型&#xff0c;对于大多数想试试的人来说&#xff0c;使用这个web ui版本最合适 建议先看完再动手&#xff0c;虽然不难但是有门槛&#xff08;主要要解决网络问题&#xff09;&#xff0c;如果深入需要会python 如果只是想试试的&#xff0c;建议…

市面上的小型办公室都是哪些人在租?

市面上的小型办公室&#xff0c;又称服务式办公室&#xff0c;是一种将传统的写字楼进行精装修&#xff0c;分割成若干个独立的小型办公空间&#xff0c;提供给不同的租户的新型办公模式。那么&#xff0c;市面上的小型办公室都是哪些人在租&#xff1f;本文将从租户的特点和需…

Linux服务器配置与管理(第四次实验)

实验目的及具体要求 目的 1.了解网络配置之文件 2.掌握网络常用命令 3.掌握ssh远程连接 任务 1.修改主机名为TX 2.查看系统的网络接口信息 3.在路由表中添加一条路由 4.删除上一步添加的路由 5.查看网络中所有的TCP端口连接信息 6.X SHELL远程链接Centos系统 7.在X …

35岁老兵,从金山被裁员到创业

35岁&#xff0c;对于许多人而言&#xff0c;是事业中一个重要的节点。对我而言&#xff0c;这一年成为了我生命中的转折点。2023年8月份的一个上午&#xff0c;突然被领导叫到小黑屋&#xff0c;告知我被裁员了。起初&#xff0c;这个决定对我来说是一个巨大的打击&#xff0c…

榜单!AR-HUD进入高增速周期,TOP10本土供应商争夺市场

高工智能汽车研究院数据显示&#xff0c;2023年1-9月&#xff0c;中国市场&#xff08;不含进出口&#xff09;乘用车前装标配W/AR HUD交付149.54万辆&#xff0c;同比增长45.86%。 其中&#xff0c;W-HUD仍是主流。而同期&#xff0c;AR-HUD的前装标配搭载量超过10万辆&#x…

Mysql-ReadView + MVCC-RR 与 RC

实验准备 创建脚本 CREATE TABLE user (id int(11) NOT NULL AUTO_INCREMENT,name varchar(16) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,age int(11) NULL DEFAULT NULL,addr varchar(256) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,PRIMARY …

希尔伯特变换的在信号解调时的示例

1.希尔伯特变换的应用场景 希尔伯特变换&#xff0c;在数学上的含义是清晰的。它是一个数字移相器&#xff0c;可以把通过它的任何一个信号相移-90度。这个数学工具在信号解调时&#xff0c;会有非常有用的特性出现。可以看示例&#xff1a; 解释一下&#xff1a; 1.最上面的…

transformer | transformer的输入部分input coding

文章目录 transformer的输入部分input codingBPEBPE所解决的问题——OOV PE&#xff08;Position Encoding&#xff09;位置编码 transformer的输入部分input coding transformer的输入部分input codingBPEPE BPE BPE是指一种词分类算法。 起初&#xff0c;会将每个单词都拆分…

旧物回收小程序开发:创新与可持续发展的交汇点

随着社会的发展和人们生活水平的提高&#xff0c;物品的更新换代速度越来越快&#xff0c;这导致了大量的旧物被闲置或丢弃。为了解决这个问题&#xff0c;旧物回收成为了重要的环保行动。而随着移动互联网的普及&#xff0c;旧物回收小程序的开发也成为了新的趋势。本文将探讨…

本次安装Visual Studio 所用的安装程序不完整。请重新运行VisualStudio安装程序以解决此问题

今天点开VS的时候遇到了这个问题 因为昨天升级到一半电脑关机了&#xff0c;今天打开软件遇到如下错误&#xff0c; 解决办法很简单&#xff0c;找到安装目录进入Installer文件夹 我的目录在C:\Program Files (x86)\Microsoft Visual Studio\Installer 找到vs_installer.exe…

《HTML 简易速速上手小册》第8章:HTML 表单高级技术(2024 最新版)

文章目录 8.1 数据收集与处理8.1.1 基础知识8.1.2 案例 1&#xff1a;创建一个注册表单8.1.3 案例 2&#xff1a;创建一个调查问卷表单8.1.4 案例 3&#xff1a;创建一个动态添加输入字段的表单 8.2 定制化表单元素8.2.1 基础知识8.2.2 案例 1&#xff1a;创建一个带有定制选择…

打击者H5小游戏

欢迎来到程序小院 打击者 玩法&#xff1a;点击飞机上下左右移动躲过子弹射击&#xff0c;打掉上方敌人飞机&#xff0c; 遇到药包会增加能量&#xff0c;弹药包会升级武器&#xff0c;快去射击吧^^。开始游戏https://www.ormcc.com/play/gameStart/262 html <div id"…

点击查看 Milvus 社区十大关键词(下)

在昨天的文章《点击查看 Milvus 社区十大关键词&#xff08;上&#xff09;》中&#xff0c;我们提到将 2023 年所有 Milvus 技术交流群的聊天历史做了整理分析&#xff0c;得到了如下的一张词云图&#xff1a; 按照热度&#xff0c;排名前十的关键词依次为&#xff1a;版本、查…