首頁>科技>

題目

給你一個整數 num 。你可以對它進行如下步驟恰好 兩次 :

選擇一個數字 x (0 <= x <= 9).

選擇另一個數字 y (0 <= y <= 9) 。數字 y 可以等於 x 。

將 num 中所有出現 x 的數位都用 y 替換。

得到的新的整數 不能 有前導 0 ,得到的新整數也 不能 是 0 。

令兩次對 num 的操作得到的結果分別為 a 和 b 。

請你返回 a 和 b 的 最大差值 。

示例 1:輸入:num = 555 輸出:888

解釋:第一次選擇 x = 5 且 y = 9 ,並把得到的新數字儲存在 a 中。

第二次選擇 x = 5 且 y = 1 ,並把得到的新數字儲存在 b 中。

現在,我們有 a = 999 和 b = 111 ,最大差值為 888

示例 2:輸入:num = 9 輸出:8

解釋:第一次選擇 x = 9 且 y = 9 ,並把得到的新數字儲存在 a 中。

第二次選擇 x = 9 且 y = 1 ,並把得到的新數字儲存在 b 中。

現在,我們有 a = 9 和 b = 1 ,最大差值為 8

示例 3:輸入:num = 123456 輸出:820000

示例 4: 輸入:num = 10000 輸出:80000

示例 5:輸入:num = 9288 輸出:8700

提示:1 <= num <= 10^8

解題思路分析

1、貪心;時間複雜度O(log(n)),空間複雜度O(log(n))

func maxDiff(num int) int {	maxValue, minValue := num, num	str := strconv.Itoa(num)	for i := 0; i < len(str); i++ {		if str[i] < '9' {			maxValue, _ = strconv.Atoi(strings.ReplaceAll(str, string(str[i]), "9"))			break		}	}	if str[0] > '1' {		minValue, _ = strconv.Atoi(strings.ReplaceAll(str, string(str[0]), "1"))	} else {		for i := 1; i < len(str); i++ {			if str[i] > '1' && str[0] != str[i] {				minValue, _ = strconv.Atoi(strings.ReplaceAll(str, string(str[i]), "0"))				break			}		}	}	return maxValue - minValue}

2、暴力法;時間複雜度O(log(n)),空間複雜度O(log(n))

func maxDiff(num int) int {	maxValue, minValue := num, num	str := strconv.Itoa(num)	for x := 0; x < 10; x++ {		for y := 0; y < 10; y++ {			newStr := strings.ReplaceAll(str, string('0'+x), string('0'+y))			if newStr[0] == '0' {				continue			}			value, _ := strconv.Atoi(newStr)			if value > maxValue {				maxValue = value			}			if value < minValue {				minValue = value			}		}	}	return maxValue - minValue}
總結

Medium題目,可以使用暴力法,也可以分析一下怎麼樣取到最大值和最小值

6
  • 整治雙十一購物亂象,國家再次出手!該跟這些套路說再見了
  • 社群團購火拼誰會是贏家