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例子来加深理解