力扣967:连续差相同的数字
力扣967:连续差相同的数字
- 题目
- 思路
- 代码
题目
返回所有长度为 n 且满足其每两个连续位上的数字之间的差的绝对值为 k 的 非负整数 。
请注意,除了 数字 0 本身之外,答案中的每个数字都 不能 有前导零。例如,01 有一个前导零,所以是无效的;但 0 是有效的。
你可以按 任何顺序 返回答案。
思路
看见任何顺序,回溯就来了。
想要使用回溯我们就得先判断回溯得结束条件是什么,这道题很简单,回溯的结束条件就是数字的长度是否等于n。之后我们观察题目来想想怎么回溯,首先我们看题目里的前导零这一个条件所以我们在插入第一个数字的时候就要判断数字的长度大于1并且第一个数字不能为0。然后我们发现两个数字之间要有条件即差的绝对值为k所以我们就需要判断是当前值减k还是当前值加k。如果当前值加k小于10那就加k如果当前值减k大于等于0那就是减k。在有了这些信息后这道题就很简单了。
代码
class Solution {
public:void dfs(vector<int>& res, string& tmp, int i, int n, int k) {if (tmp.size() == n) {res.push_back(stoi(tmp));return;}// 判断是插入i+k还是i-k// 如果下一个插入的数字小于10if (i + k < 10) {// 直接插入然后继续dfstmp += to_string(i + k);dfs(res, tmp, i + k, n, k);tmp.pop_back();}// 如果i-k大于等于0并且k不等于0if (k != 0 && i - k >= 0) {tmp += to_string(i - k);dfs(res, tmp, i - k, n, k);tmp.pop_back();}}vector<int> numsSameConsecDiff(int n, int k) {vector<int> res;string tmp;for (int i = 0; i < 10; i++) {if (n > 1 && i == 0) {continue;}tmp = to_string(i);// 回溯dfs(res, tmp, i, n, k);}return res;}
};