leetcode566下一个更大元素3

leetcode566

Posted by BY on August 23, 2018

前言

真菜的我。

正文

问题来源

本问题来自leetcode上的556题。用go语言做的

问题描述

给定一个32位正整数 n,你需要找到最小的32位整数,其与 n 中存在的位数完全相同,并且其值大于n。如果不存在这样的32位整数,则返回-1。

示例 1:

输入: 12
输出: 21

示例 2:

输入: 21
输出: -1

分析:

如果从数字的第k位开始到数字尾部都是递减的并且第k位数字比第k-1位数字大,表明从第k位开始到尾部的这段数字是他们能组合出的最大数字,在下一个数字中他们要整体倒序变为能组合出的最小数字,倒序后从这段数字序列中找出第一个大于第k-1位数字的位置和第k-1位交换即可。举个栗子,如果n=13452,其中52是递减的,而且5>4,这样我们先把52倒序,n就变为13425,然后从25中找出第一个大于4的数字和4交换,就得到了最终结果13524。需要注意的是下一个数字可能会超出INT_MAX范围。 本人写的Go代码如下:

const MAX_INT = 2147483647
func reverse(num []byte, b int, e int) {
	mid := (b+e-1)/2
	for i:=0; b+i<=mid; i++ {
		num[b+i],num[e-i] = num[e-i],num[b+i]
	}
}
func nextGreaterElement(n int) int {
	str := strconv.Itoa(n)
	num := []byte(str)
	l := len(num)
	i := l - 1
	for (i != 0) && (num[i] <= num[i-1])  {
		i--
	}
	if i == 0 {
		return -1
	}
	reverse(num, i, l-1)
	
	for j:=i; j<l; j++ {
		if num[j] > num[i-1] {
			num[j], num[i-1] = num[i-1],num[j]
			break
		}
	}
	str = string(num[:])
    if (10 == l) && (strings.Compare(str, strconv.Itoa(MAX_INT))>0) {
        return -1
    }
	ret, err := strconv.Atoi(str)
	if nil != err {
		return -1
	}
	return ret
}

总结:

勤思考

结语

不管怎么样好好加油。