Contents

ARST打卡第165周[165/521]

Algorithm

lc556_下一个更大元素3

思路:

  • 获取每个位置的数值,然后判断是否降序,如果全降序,则返回-1
  • 否则选择逆序对里面最小的一对来交换(直接返回最右端的逆序对)
  • 关于超过int32正整数,也就是判断结果是否为负数,为则返回-1

结果发现不行,要反向找到第一个不降序的,然后再反向找第一个大于这个数的逆序对,最后交换,然后把第一个数位置后面的改成顺序的,因为前面的降序特性,只要翻转就好

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// func nextGreaterElement(n int) int {
// 	words := []byte(strconv.Itoa(n))
// 	nLen := len(words)
// 	for i := nLen - 1; i >= 1; i-- {
// 		for j := i - 1; j >= 0; j-- {
// 			if words[i] > words[j] {
// 				words[i], words[j] = words[j], words[i]
// 				ans_s := string(words)
// 				ans, err := strconv.Atoi(ans_s)
// 				if err != nil {
// 					fmt.Println("Atoi error")
// 					return -1
// 				}
// 				return ans
// 			}
// 		}
// 	}
// 	return -1
// }

func nextGreaterElement(n int) int {
	nums := []byte(strconv.Itoa(n))
	i := len(nums) - 2
	for i >= 0 && nums[i] >= nums[i+1] {
		i--
	}
	if i < 0 {
		return -1
	}

	j := len(nums) - 1
	for j >= 0 && nums[i] >= nums[j] {
		j--
	}
	nums[i], nums[j] = nums[j], nums[i]
	reverse(nums[i+1:])
	ans, _ := strconv.Atoi(string(nums))
	if ans > math.MaxInt32 {
		return -1
	}
	return ans
}

func reverse(a []byte) {
	for i, n := 0, len(a); i < n/2; i++ {
		a[i], a[n-1-i] = a[n-1-i], a[i]
	}
}

// 作者:LeetCode-Solution
// 链接:https://leetcode.cn/problems/next-greater-element-iii/solution/xia-yi-ge-geng-da-yuan-su-iii-by-leetcod-mqf1/

Review

【TED演讲】如何建立一个百年企业

让企业长期生存就像身体免疫系统:

  • 再生能力 - 系统克隆,使企业有活力再生
  • 分化能力 - 和投资配置类似,不要把鸡蛋放在一个篮子里,而是保证主营业务,并且要多个业务尝试
  • 模块化 - 把一些流程和设计模块化,方便快速重组,而免受一损俱损

Tips

error和创建error源码解析

Share

errgroup学习指南:

可以先看 处理并发错误

如果没有看懂context就看: context包

然后看golang中errgroup官方包中的Example例子来加深理解