算法基础:最大递减数问题(Golang实现)

时间:2022-05-04
本文章向大家介绍算法基础:最大递减数问题(Golang实现),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

给出一个非负整数,找到这个非负整数中包括的最大递减数。一个数字的递减数是指相邻的数位从大到小排列的数字。 如: 95345323,递减数有:953,95,53,53,532,32, 那么最大的递减数为953。 假设输入的数字为负数,返回-1。 假设找不到递减数,也返回-1.

代码实现:

package huawei

import (
	"fmt"
	"sort"
	"strconv"
)

func Test5Base() {
	num := 431492
	degressiveNums := getDegressiveNums(num)

	max := -1
	if len(degressiveNums) > 0 {
		max = getMax(degressiveNums)
	}

	fmt.Println("max:", max)
}

//获取num的全部递减数
func getDegressiveNums(num int) []int {
	if num < 0 {
		return []int{-1}
	}

	degressiveNums := make([]int, 0)
	numStr := strconv.Itoa(num)
	length := len(numStr)
	//长度为i的子串
	for i := 2; i < length; i++ {
		//从j開始截取
		for j := 0; j < length-i+1; j++ {
			//截取数字
			n, err := strconv.Atoi(numStr[j : j+i])
			checkError(err, "string to integer")

			//是否为递减数
			if isDegressive(n) {
				degressiveNums = append(degressiveNums, n)
			}
		}
	}

	return degressiveNums
}

//推断数字num是否是递减数
func isDegressive(num int) bool {
	weishu := make([]int, 0)
	for num >= 1 {
		n := num % 10
		weishu = append(weishu, n)
		num /= 10
	}

	return sort.IntsAreSorted(weishu)
}

//获取一个slice中最大的数
func getMax(nums []int) int {
	if len(nums) == 0 {
		panic("empty slice.")
	}

	max := nums[0]
	for i := 1; i < len(nums); i++ {
		if nums[i] > max {
			max = nums[i]
		}
	}

	return max
}