2023-04-11:给你下标从 0 开始、长度为 n 的字符串 pattern , 它包含两种字符,‘I‘ 表示 上升 ,‘D‘ 表示 下降 。 你需要构造一个下标从 0 开始长度为 n + 1 的
2023-04-11:给你下标从 0 开始、长度为 n 的字符串 pattern ,
它包含两种字符,‘I’ 表示 上升 ,‘D’ 表示 下降 。
你需要构造一个下标从 0 开始长度为 n + 1 的字符串,且它要满足以下条件:
num 包含数字 ‘1’ 到 ‘9’ ,其中每个数字 至多 使用一次。
如果 pattern[i] == ‘I’ ,那么 num[i] < num[i + 1] 。
如果 pattern[i] == ‘D’ ,那么 num[i] > num[i + 1] 。
请你返回满足上述条件字典序 最小 的字符串 num。
输入:pattern = “IIIDIDDD”,
输出:“123549876”。
答案2023-04-11:
解题思路
这是一道比较有趣的贪心题目。我们可以根据给定的 pattern 字符串来决定数字串中相邻两个数的关系。
步骤1:定义 next 函数
首先,我们需要定义一个函数 next(status, num),用来查找在状态 status 中没有使用过的最小数字(大于 num)。该函数通过遍历数字 1 到 9,判断哪些数字在 status 中未被使用,且大于 num,然后返回其中最小的数字。
fn next(status: usize, num: u8) -> Option<u8> {
for i in (num + 1)..=9 {
if (status & (1 << i)) == 0 {
return Some(i as u8);
}
}
None
}
步骤2:定义 create 函数
接着,我们需要定义另一个函数 create(pattern, index, status, number),用来递归生成数字串,并判断是否符合要求。在递归过程中,我们需要判断当前位应该填入哪个数字,并根据数字的大小关系更新 status、number 和 index 的值。如果生成的数字串不符合要求,则需要回溯并重新选择数字。
fn create(pattern: &[char], index: usize, status: &mut usize, number: &mut u32) -> bool {
if index == pattern.len() + 1 {
return true;
}
let mut cur = 0;
while let Some(next_cur) = next(*status, cur) {
cur = next_cur;
// cur == 0 , 当前位,1 X
// cur == 1 , 当前位,2 X
// cur == 2, 当前位,4
// pattern I D >
// 0 1 2 3
// ? ? ? ?
// D
// 0 1
// 5 ?
if index == 0
|| (pattern[index - 1] == 'I' && *number % 10 < cur as u32)
|| (pattern[index - 1] == 'D' && *number % 10 > cur as u32)
{
*status |= 1 << cur;
*number = *number * 10 + cur as u32;
if create(pattern, index + 1, status, number) {
return true;
}
*number /= 10;
*status &= !(1 << cur);
}
}
false
}
步骤3:定义 smallest_number 函数
最后,我们需要定义 smallest_number 函数,调用 create 函数来生成数字串,并将其转化为字符串类型返回。
fn smallest_number(pattern: &str) -> String {
let chars = pattern.chars().collect::<Vec<_>>();
let mut status = 0usize;
let mut number = 0;
create(&chars, 0, &mut status, &mut number);
number.to_string()
}
时间复杂度
对于这个解法,最坏情况下需要枚举所有可能的数字串,因此时间复杂度为 O(n * 9!),其中 n 是 pattern 字符串的长度。在实际测试中,由于存在大量剪枝操作,实际运行时间要比这个上界要小得多。
空间复杂度
主要的存储空间是用来记录数字是否被使用过的 status 变量和已经生成的数字串 number 变量,以及递归调用栈所占用的空间。其中,status 和 number 变量的大小均为常数级别,因此空间复杂度为 O(1)。递归调用栈的深度最多为 n + 1,因此空间复杂度为 O(n)。
rust完整代码如下:
fn smallest_number(pattern: &str) -> String {
let chars = pattern.chars().collect::<Vec<_>>();
let mut status = 0usize;
let mut number = 0;
create(&chars, 0, &mut status, &mut number);
number.to_string()
}
/// 返回 i... 所有数字都决定了,并且不破坏pattern,
/// 并且1~9每个数字最多用一次能出来的最小值是啥,返回
fn create(pattern: &[char], index: usize, status: &mut usize, number: &mut u32) -> bool {
if index == pattern.len() + 1 {
return true;
}
let mut cur = 0;
while let Some(next_cur) = next(*status, cur) {
cur = next_cur;
// cur == 0 , 当前位,1 X
// cur == 1 , 当前位,2 X
// cur == 2, 当前位,4
// pattern I D >
// 0 1 2 3
// ? ? ? ?
// D
// 0 1
// 5 ?
if index == 0
|| (pattern[index - 1] == 'I' && *number % 10 < cur as u32)
|| (pattern[index - 1] == 'D' && *number % 10 > cur as u32)
{
*status |= 1 << cur;
*number = *number * 10 + cur as u32;
if create(pattern, index + 1, status, number) {
return true;
}
*number /= 10;
*status &= !(1 << cur);
}
}
false
}
/// 返回没有使用,且 > num, 最小的数字
fn next(status: usize, num: u8) -> Option<u8> {
for i in (num + 1)..=9 {
if (status & (1 << i)) == 0 {
return Some(i as u8);
}
}
None
}
fn main() {
let pattern = "IIIDIDDD";
let result = smallest_number(pattern);
println!("{}", result); // 输出:123549876
}

2023-04-11:给你下标从 0 开始、长度为 n 的字符串 pattern , 它包含两种字符,‘I‘ 表示 上升 ,‘D‘ 表示 下降 。 你需要构造一个下标从 0 开始长度为 n + 1 的的更多相关文章
- zabbix3.0.4使用shell脚本和zabbix自带模板两种方法添加对指定进程和端口的监控
zabbix3.0.4添加对进程的监控: 方法一:通过自定义命令进行监控 主要思路: 通过 ps -ef|grep sdk-push-1.0.0.jar |grep -v grep|wc -l 这个命 ...
- SQL 按月统计(两种方式) 分类: SQL Server 2014-08-04 15:36 154人阅读 评论(0) 收藏
(1)Convert 函数 select Convert ( VARCHAR(7),ComeDate,120) as Date ,Count(In_code) as 单数,Sum(SumTrueNum ...
- 转载:Flash AS3.0 加载外部资源(图片,MP3,SWF)的两种方式
Flash AS3.0 加载外部资源(图片,MP3,SWF)的两种方式 出自:http://www.cnblogs.com/top5/archive/2012/08/04/2623464.html 关 ...
- 4.写一个控制台应用程序,接收一个长度大于3的字符串,完成下列功能: 1)输出字符串的长度。 2)输出字符串中第一个出现字母a的位置。 3)在字符串的第3个字符后面插入子串“hello”,输出新字符串。 4)将字符串“hello”替换为“me”,输出新字符串。 5)以字符“m”为分隔符,将字符串分离,并输出分离后的字符串。 */
namespace test4 {/* 4.写一个控制台应用程序,接收一个长度大于3的字符串,完成下列功能: 1)输出字符串的长度. 2)输出字符串中第一个出现字母a的位置. 3)在字符串的第3个字符 ...
- C#返回字符串的字节长度,一个中文算两个字符的代码
如下代码段是关于C#返回字符串的字节长度,一个中文算两个字符的代码. public static int GetLength(string str) { if (str.Length == 0) re ...
- Shell脚本中字符串判空:使用-z 字符串长度为0时,为真,-n字符串长度不为0,为真。这两个都不靠谱【转】
最近发现使用 -z 和 -n 来判断字符串判空,或不空时,很不靠谱. 使用下面的方法最可靠: if [ "x${value}" == "x" ] ...
- php在数字前面补0得到固定长度数字的两种方法
比較基础,事实上两个内置函数都能实现. 1 sprintf 语法: string sprintf(string format, mixed [args]...); 返回值: 字符串 函数种类: 资料 ...
- 20172319 2018.04.11 《Java程序设计教程》第7周课堂测验(补写博客)
20172319 2018.04.11 <Java程序设计教程>第7周课堂测验 课程:<程序设计与数据结构> 班级:1723 学生:唐才铭 学号:20172319 指导老师:王 ...
- LeetCode 周赛 342(2023/04/23)容斥原理、计数排序、滑动窗口、子数组 GCB
本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 大家好,我是小彭. 前天刚举办 2023 年力扣杯个人 SOLO 赛,昨天周赛就出了一场 Easy - Ea ...
- 山东理工大学第七届ACM校赛-字符的变化 分类: 比赛 2015-06-26 10:32 46人阅读 评论(0) 收藏
字符的变化 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 一个长度为n(1<=n<=1000)的字符串(只包含小写字 ...
随机推荐
- C# DataTable操作,转载
DataTable 排序 DataRow[] rows = dataTable1.Select("", "ord asc"); DataTable t ...
- 在.net core中开发web页面,更新html代码刷新不生效的问题
因为在.net core之后的版本,程序都是以控制台应用程序的方式存在,所以一些老的项目升级后,会出现这样的情况, 解决方法,在nuget中引入 Microsoft.AspNetCore.Mvc.Ra ...
- For循环用法-打印乘法表
for循环可以遍历某一对象(遍历:通俗点说,就是把这个循环中的第一个元素到最后一个元素依次访问一次).for循环的结构如下 具体例子打印乘法表: #打印乘法表: for i in range(1, ...
- nacos实现Java和.NetCore的服务注册和调用
用nacos作为服务注册中心,如何注册.NetCore服务,如何在Java中调用.NetCore服务呢?可以分为下面几个步骤: 0.运行nacos 1.开发.net core服务,然后调用nacos提 ...
- RPA的概念及未来发展趋势
RPA是Robotic Process Automation(机器人自动化)的简称.我们可以把它理解为"虚拟机器人"替代人工的一种方式.RPA不仅可以模拟人类,而且可以利用和融 ...
- 微软NewBing真是Niubility
这是本人2012年的拙作: 晨兮,闻风雨,后而雷鸣电闪.迟不可再三,若故无食.然何如耶?雨大风狂,单车奈何?公交卡空,恐时不予我也.不免叹也,天亦不予我! 而后出, ...
- 【个人首测】百度文心一言 VS ChatGPT GPT-4
昨天我写了一篇文章GPT-4牛是牛,但这几天先别急,文中我测试了用GPT-4回答ChatGPT 3.5 和 Notion AI的问题,大家期待的图片输入也没有出现. 昨天下午百度发布了文心一言,对标C ...
- 跳出思维的“盒子”,聊聊 RTE 应用创新大赛的那些作品
由声网Agora 与环信联合主办的"RTE 2021 编程挑战赛"已圆满落幕.在今年的大赛中,来自行业中不同领域的专家参与了决赛评选,包括 Linux 中国技术社区技术负责人 白宦 ...
- KCL v0.4.6 alpha 发布!- 更多 Kubernetes 工具集成,更好的 IDE 错误提示
简介 KCL 团队很高兴地宣布 KCL v0.4.6-alpha.1 版本现在已经可用! 您可以在 KCL v0.4.6-alpha.1 发布页面 或者 KCL 官方网站 获得 KCL 二进制下载链接 ...
- 关于springboot使用mybatis查询出现空指针,以及debug出现All Elements all Null的解决方法
数据库中命名方式是带有下划线 ,然后在实体类中使用的是驼峰命名法 ,那么就需要在application.yml文件中加上 自闭了,那么简单的问题,没了解过真是摸不着头脑