leetcode-640-表达式解析-解题思路

这个提其实不太难,第一眼却没做出来,看了题解之后才思路清晰了, 有思路了很容易做出来
所有的表达式,经过计算最总都会变成, n\*x + val = 0 , n val 都是数值,我们要做的就是把 n ,val 计算出来,

  • 考虑等号(“=”)的问题,和做算术题一样,把右边挪到左边, 相当于就是减去左边, 也就是 减一下(-)
    设置一个标记,把之后的值都取个反, 对于代码的话, 不就是 a = -a 么?
  • 符号判断, 加号, 减号 ,等于号 , 加号 不用管 ,减号 取个反, 还有一个考虑点就是 = 这个标记之后的情况, 结合判断
    例如: 如果是 = 右边的, 本来是 - , 现在就变成了 +
  • 解析 x 之前的数字,这个就是一个数字字符串 转数字的算法
    可能是 100x, 5x, 18x 等等这种情况, 其实就是正常解析数字字符串一样, 每次 数值*10 + 当前值 ,直到 不是数字 停止, 保存并累加
  • 正常数值就没啥考虑的了,直接累加即可.

最后根据结果,进行计算, 需要判断表达式是否有效的情况.

如果 n*xn0 的时候,x 对表达式无影响, 这时候,判断 val 即可:

  • 如果val = 00 = 0, 有 无数解,任意值都可以,
  • 如果是 val != 0 ,那么就是无解.

剩下情况就是正常解, 返回 -val / n 即可. 下面是官方的 golang 题解。

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
func solveEquation(equation string) string {
factor, val := 0, 0
i, n, sign := 0, len(equation), 1 // 等式左边默认系数为正
for i < n {
if equation[i] == '=' {
sign = -1 // 等式右边默认系数为负
i++
continue
}

s := sign
if equation[i] == '+' { // 去掉前面的符号
i++
} else if equation[i] == '-' {
s = -s
i++
}

num, valid := 0, false
for i < n && unicode.IsDigit(rune(equation[i])) {
valid = true
num = num*10 + int(equation[i]-'0')
i++
}

if i < n && equation[i] == 'x' { // 变量
if valid {
s *= num
}
factor += s
i++
} else { // 数值
val += s * num
}
}

if factor == 0 {
if val == 0 {
return "Infinite solutions"
}
return "No solution"
}
return "x=" + strconv.Itoa(-val/factor)
}

leetcode-640-表达式解析-解题思路

https://www.md7.top/2023/06/08/力扣640-leetcode-640解题/

作者

Fat Dong

发布于

2023-06-08

更新于

2023-06-08

许可协议

leetcode-482 秘钥格式化

描述

English:
You are given a license key represented as a string s that consists of only alphanumeric characters and dashes. The string is separated into n + 1 groups by n dashes. You are also given an integer k.

We want to reformat the string s such that each group contains exactly k characters, except for the first group, which could be shorter than k but still must contain at least one character. Furthermore, there must be a dash inserted between two groups, and you should convert all lowercase letters to uppercase.

Return the reformatted license key.

中文:
给定一个字符串由字母、数字、“-”组成,是由 “-” 分割成了 n个组,给定一个 数字 k,

要求:返回一个新字符串,这个字符串也是有“-” 分割成n组,但是除了第一组,每组要有 k 个字符,第一组也至少有一个字符。并且把所有小写字符转成成大写字符。

题解:

这个题本身其实不难,主要是这个中文描述没看懂,英文太差也看不懂。我直接把官方解扒下来了

分成 n 组,除了第一组,其他的每组 k 个字符,这不就是 对 k 取模么? 剩下的不就是第一组,

因为要求是第一组可以少于看k ,那么我们可以从后遍历,满足 k 个字符 就插入 一个 “-”,遍历所有之后,然后再翻转一下。 小细节: 需要判断最后的是否是一个“-”

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
func licenseKeyFormatting(s string, k int) string {
var res []byte
var n = 0
var l = len(s)
// 从后开始遍历
for i := l - 1; i >= 0; i-- {
if s[i] != '-' {
res = append(res, byte(unicode.ToUpper(rune(s[i]))))
n++ // 标记 数量
}
if n%k == 0 { // 符合 k 的倍数,测插入一个 -
res = append(res, '-')
}
}

// 删除结尾的 -
if len(res) > 0 && res[len(res)-1] == '-' {
res = res[:len(res)-1]
}
// 因为是从后开始遍历的,最末尾的字符目前在最开始,需要把字符翻转
for i, n := 0, len(res); i < n/2; i++ {
res[i], res[n-1-i] = res[n-1-i], res[i]
}
return string(res)
}
作者

Fat Dong

发布于

2022-09-01

更新于

2022-09-01

许可协议