Missing number

本文介绍了一种使用回溯法解决寻找缺失数字的问题。给定正整数n及由n-1个随机排列的数字组成的字符串s,通过合理的字符串划分找出1到n间缺失的数字。文章提供了详细的解题思路及C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、题目

Given a positive integer n(n≤40), pick n-1 numbers randomly from 1 to n and concatenate them in random order as a string s, which means there is a missing number between 1 and n. Can you find the missing number?(Notice that in some cases the answer will not be unique, and in these cases you only need to find one valid answer.)

Examples:
 

  Input: 20
         81971112205101569183132414117
  Output: 16

二、题意

给定正整数n(n≤40),从1到n中随机选择n-1个数,并将它们以随机顺序连接为字符串s,这意味着在1和n之间有一个缺失的数字。你能找到那个缺失的数字吗?(请注意在某些情况下答案不唯一,此时你只需要找到一个有效的答案。)

三、解题思路

分支限界+回溯

归根结底本题时要找到字符串s的合理划分方法,因此可以用回溯法求解。假设字符串s长度为n,则当第i(i<n)个字符要么单独划分为一个数,要么和i+1一起划分为一个数;而第n个字符只能单独划分为一个数。因此可采用回溯法,向下一层左子树搜索的约束条件就是由第i个字符与第i+1个字符结合得到的数字落在1到n的范围内且之前未被划分出来,向下一层右子树搜索的约束条件就是由第i个字符单独形成的数字落在1到n的范围内且之前未被划分出来。如若当前字符为'0',说明之前的划分有误(因为'0'既不能和后一个字符结合,也不能单独成数),应该直接返回上一层。如何知道已经找到了正确的划分呢?只需要在搜索到叶子结点时检验是不是已经划分出n-1个数字即可。

因此划分和回溯就出来了:

1、当前字符下标等于n时,划分结束,判断当前是否找到了n-1个并输出

2、当前字符下标等于n-1时,只有单独划分的情况,递归调用(下标+1)

3、当前字符下标小于n-1时,有两种划分情况:

     1) 单独划分,递归调用(下标+1)

     2) 与后一个一起相组划分,递归调用(下标+2)

#include <iostream>
using namespace std;
int a[41] = {0};   // 记录这些数字有没有被找到 
bool flag = 0;     // 标记找到没,只找一个数 
void find(int findnum, string s, int index, int n){
	int length = s.length();
	if(flag == 1) return;
	if(index == length){
		// 判断有无符合要求的返回
		if(findnum == n-1){
			for(int i=1; i<=n; i++)
				if(a[i] == 0)
					cout<<i<<endl;
			flag = 1;
		}
	}
	if(index == length - 1){   // 最后一个数只能单独成数 
		// 单独成数
		if(a[s[index] - '0'] == 0 && s[index] != '0' && findnum<=n-1 && (s[index]-'0')<=n){
			a[s[index] - '0'] = 1;
			find(findnum+1, s, index+1, n);
			a[s[index] - '0'] = 0;  // 回溯 
		}
	}
	if(index < length - 1){
		// 单独成数
		if(a[s[index] - '0'] == 0 && s[index] != '0' && findnum<=n-1 && (s[index]-'0')<=n){
			a[s[index] - '0'] = 1;
			find(findnum+1, s, index+1, n);
			a[s[index] - '0'] = 0;  // 回溯 
		}
		// 与后一个成数
		if(s[index] != '0' && findnum<=n-1){
			int temp = (s[index] - '0')*10 + (s[index+1]-'0');
			if(temp<= n && a[temp] == 0){
				a[temp] = 1;
				find(findnum+1, s, index+2, n);
				a[temp] = 0;  // 回溯 
			}
		}
	}
}
int main (){
	int n;
	cin>>n;
	string s;
	cin>>s;
	find(0, s, 0, n);
	
	return 0;
} 

参考博文:https://blog.youkuaiyun.com/climber16/article/details/81604342

### 解决 LaTeX 中 'Missing number, treated as zero' 错误的方法 在处理 LaTeX 编译过程中遇到的 `Missing number, treated as zero` 错误时,通常是因为某些命令期望接收数值参数却未接收到有效输入。以下是可能的原因及其解决方案: #### 1. **检查单位缺失** 如果在设置长度或尺寸时忘记指定单位,则可能导致此错误。例如,在定义宽度或其他测量值时,应始终提供有效的单位(如 pt、mm 或 cm)。 ```latex \includegraphics[width=\textwidth]{image.png} ``` 上述代码中,`\textwidth` 是一个无单位的宏,但如果将其替换为具体的数字而未附带单位,就会引发错误[^1]。 #### 2. **确认子图环境配置正确** 当使用 `subfigure` 宏包时,可能会因为语法不匹配而导致该错误。建议改用更现代的 `subcaption` 宏包替代 `subfigure`,确保其调用方式正确: ```latex \usepackage{subcaption} \begin{figure}[h!] \centering \begin{subfigure}{0.48\textwidth} % 此处需带有单位的比例值 \includegraphics[width=\linewidth]{image1.png} \caption{Sub-caption A} \end{subfigure} \hfill \begin{subfigure}{0.48\textwidth} % 同样需要比例值加单位 \includegraphics[width=\linewidth]{image2.png} \caption{Sub-caption B} \end{subfigure} \caption{Main caption for both figures.} \end{figure} ``` 注意:这里的 `{0.48\textwidth}` 需要明确给出百分比形式以及 `\textwidth` 单位[^5]。 #### 3. **排查冲突宏包** 有时多个宏包之间可能存在功能重叠或者命名空间上的干扰。比如同时加载了 `subfigure` 和 `subcaption`,这会触发兼容性问题从而造成编译失败。因此推荐仅保留其中一个必要工具即可消除潜在隐患[^2]。 #### 4. **验证frontmatter部分特殊指令** 对于前置材料(front matter),特别是书籍类文档结构中的章节声明(`\frontmatter`, `\mainmatter`)等操作符来说,它们内部实现依赖于计数器(counter)调整逻辑;一旦这些基础组件被不当修改就容易引起此类异常行为。所以务必遵循标准模板书写习惯,除非确实了解底层机制才尝试自定义改动[^3]。 通过以上分析可以针对性地定位具体场景下的原因,采取相应措施修复问题。最终目标是让所有涉及数量级设定的地方都具备清晰合理的表达形式,进而顺利完成整个项目的排版工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值