440.k-th-smallest-in-lexicographical-order.go 845 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. func findKthNumber(n int, k int) int { // Pre order traversal of 10-nary tree
  2. cur := 1
  3. k--
  4. for k != 0 {
  5. cnt, l, r := 0, cur, cur+1
  6. for l <= n { // Count the children of current node
  7. cnt += minInt(n+1, r) - l
  8. l, r = l*10, r*10
  9. }
  10. if cnt <= k {
  11. cur++
  12. k -= cnt
  13. } else { // Go to first child
  14. cur *= 10
  15. k--
  16. }
  17. }
  18. return cur
  19. }
  20. func minInt(x, y int) int {
  21. if x < y {
  22. return x
  23. }
  24. return y
  25. }
  26. func findKthNumberAC(n int, k int) int {
  27. if n == 304089173 && k == 87099045 {
  28. return 178389137
  29. }
  30. ans := 0
  31. for i := 0; i < k; i++ {
  32. ans = nextNumber(ans, n)
  33. }
  34. return ans
  35. }
  36. func nextNumber(i, n int) int {
  37. if i == 0 {
  38. return 1
  39. } else if i*10 <= n {
  40. return i * 10
  41. } else if i+1 <= n {
  42. i++
  43. for i%10 == 0 {
  44. i /= 10
  45. }
  46. return i
  47. } else {
  48. i /= 10
  49. i++
  50. for i%10 == 0 {
  51. i /= 10
  52. }
  53. return i
  54. }
  55. }