738.单调递增的数字

106 阅读1分钟

题目:
当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。

给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。
算法:

func monotoneIncreasingDigits(n int) int {
	if n < 10 {
		return n
	}
	ncopy := n
	nArray := make([]int, 0)
	for ncopy > 0 {
		nArray = append(nArray, ncopy % 10)
		ncopy = ncopy / 10
	}

	for left, right := 0, len(nArray) - 1; left < right; left, right = left + 1, right -1 {
		nArray[left], nArray[right] = nArray[right], nArray[left]
	}
	i := 1
	for i < len(nArray) && nArray[i - 1] <= nArray[i]{
		i ++
	}
	// 3321->2999
	// 2321->2299
	// 从n的高位到低位,找到第一个index ,nArray[index] > nArray[index + 1]
	// 从index + 1开始向低位的所有数要变成9,index位置的数要减1,不够就向高位借
	if i < len(nArray) {
		for i > 0 && nArray[i - 1] > nArray[i] {
			nArray[i - 1] --
			i --
		}
		for i ++; i < len(nArray); i ++ {
			nArray[i] = 9
		}
	}

	// 第i位不用变了
	ans := 0
	for j := 0; j < len(nArray); j ++ {
			ans = ans * 10 + nArray[j]
	}

	// 组合数字得到结果
	return ans
}