返回介绍

solution / 0300-0399 / 0386.Lexicographical Numbers / README

发布于 2024-06-17 01:04:01 字数 4302 浏览 0 评论 0 收藏 0

386. 字典序排数

English Version

题目描述

给你一个整数 n ,按字典序返回范围 [1, n] 内所有整数。

你必须设计一个时间复杂度为 O(n) 且使用 O(1) 额外空间的算法。

 

示例 1:

输入:n = 13
输出:[1,10,11,12,13,2,3,4,5,6,7,8,9]

示例 2:

输入:n = 2
输出:[1,2]

 

提示:

  • 1 <= n <= 5 * 104

解法

方法一:DFS

class Solution:
  def lexicalOrder(self, n: int) -> List[int]:
    def dfs(u):
      if u > n:
        return
      ans.append(u)
      for i in range(10):
        dfs(u * 10 + i)

    ans = []
    for i in range(1, 10):
      dfs(i)
    return ans
class Solution {
  public List<Integer> lexicalOrder(int n) {
    List<Integer> ans = new ArrayList<>();
    for (int i = 1; i < 10; ++i) {
      dfs(i, n, ans);
    }
    return ans;
  }

  private void dfs(int u, int n, List<Integer> ans) {
    if (u > n) {
      return;
    }
    ans.add(u);
    for (int i = 0; i < 10; ++i) {
      dfs(u * 10 + i, n, ans);
    }
  }
}
class Solution {
public:
  vector<int> lexicalOrder(int n) {
    vector<int> ans;
    for (int i = 1; i < 10; ++i) dfs(i, n, ans);
    return ans;
  }

  void dfs(int u, int n, vector<int>& ans) {
    if (u > n) return;
    ans.push_back(u);
    for (int i = 0; i < 10; ++i) dfs(u * 10 + i, n, ans);
  }
};
func lexicalOrder(n int) []int {
  var ans []int
  var dfs func(u int)
  dfs = func(u int) {
    if u > n {
      return
    }
    ans = append(ans, u)
    for i := 0; i < 10; i++ {
      dfs(u*10 + i)
    }
  }
  for i := 1; i < 10; i++ {
    dfs(i)
  }
  return ans
}
impl Solution {
  fn dfs(mut num: i32, n: i32, res: &mut Vec<i32>) {
    if num > n {
      return;
    }
    res.push(num);
    for i in 0..10 {
      Self::dfs(num * 10 + i, n, res);
    }
  }

  pub fn lexical_order(n: i32) -> Vec<i32> {
    let mut res = vec![];
    for i in 1..10 {
      Self::dfs(i, n, &mut res);
    }
    res
  }
}
/**
 * @param {number} n
 * @return {number[]}
 */
var lexicalOrder = function (n) {
  let ans = [];
  function dfs(u) {
    if (u > n) {
      return;
    }
    ans.push(u);
    for (let i = 0; i < 10; ++i) {
      dfs(u * 10 + i);
    }
  }
  for (let i = 1; i < 10; ++i) {
    dfs(i);
  }
  return ans;
};

方法二

class Solution {
  public List<Integer> lexicalOrder(int n) {
    List<Integer> ans = new ArrayList<>();
    int v = 1;
    for (int i = 0; i < n; ++i) {
      ans.add(v);
      if (v * 10 <= n) {
        v *= 10;
      } else {
        while (v % 10 == 9 || v + 1 > n) {
          v /= 10;
        }
        ++v;
      }
    }
    return ans;
  }
}
class Solution {
public:
  vector<int> lexicalOrder(int n) {
    vector<int> ans;
    int v = 1;
    for (int i = 0; i < n; ++i) {
      ans.push_back(v);
      if (v * 10 <= n)
        v *= 10;
      else {
        while (v % 10 == 9 || v + 1 > n) v /= 10;
        ++v;
      }
    }
    return ans;
  }
};
func lexicalOrder(n int) []int {
  var ans []int
  v := 1
  for i := 0; i < n; i++ {
    ans = append(ans, v)
    if v*10 <= n {
      v *= 10
    } else {
      for v%10 == 9 || v+1 > n {
        v /= 10
      }
      v++
    }
  }
  return ans
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文