单调递增的数字
题目
给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。
(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)
输入: n=332, 输出 299
解题思路
贪心思路
①.要使目标数字和 N 最接近,则需要尽可能保持高位数字不动
②.若某高位数字减 1,则后续所有低位数字都可直接更改为 9,可保持最接近
③.若低位数字更改为 9,则前一高位数字至少得减 1,可保持最接近
解题步骤
因此,首先从高位开始找到第一个非升序的位,将此位减 1,后续所有位改为 9;然后从此位开始往前判断看更改后是否满足升序要求,若不满足要求则把本位也提升到 9,前一位继续减 1,直到满足升序。
代码
package main
import (
"fmt"
"strconv"
)
func monotoneIncreasingDigits(n int) int {
s := []byte(strconv.Itoa(n))
i := 1
for i < len(s) && s[i] >= s[i-1] {
i++
}
if i < len(s) {
for i > 0 && s[i] < s[i-1] {
s[i-1]--
i--
}
for i++; i < len(s); i++ {
s[i] = '9'
}
}
ans, _ := strconv.Atoi(string(s))
return ans
}
func main() {
res := monotoneIncreasingDigits(332)
fmt.Println(res)
}
small_lei_it 技术无止境,追求更高。

浙公网安备 33010602011771号