概念学习
罗马数字转整数
I = 1
V = 5
X = 10
L = 50
C = 100
D = 500
M = 1000
罗马数字,如果大数在左小数在右侧,那么可以将字符视为单独数值,做相加处理
class Solution:
def romanToInt(self, s: str) -> int:
Im = {'I': 1,'V': 5,'X': 10,'L': 50,'C': 100,'D': 500,'M': 1000,}
total = 0
for char in s:
if char in Im:
total += Im[char]
return total
但如果左侧为小数,则要做减法XIV = 10−1+5=14
if i > 0 and Im[s[i]] > Im[s[i-1]]
total += Im[s[i]] - 2 * Im[s[i-1]]
减法的关键在于*2 假设输入为“IV”(4)在便利“I”时total已经加上了一个1使得如果直接将两数相减5-1=4 4+1=5会出现错误,所以需要乘2来抵消之前的错误相加
class Solution:
def romanToInt(self, s: str) -> int:
Im = {'I': 1,'V': 5,'X': 10,'L': 50,'C': 100,'D': 500,'M': 1000,}
total = 0
for i in range(len(s)):
if i > 0 and Im[s[i]] > Im[s[i-1]]:
total += Im[s[i]] - 2 * Im[s[i-1]]
else:
total += Im[s[i]]
return total
最长公共前缀
-
纵向扫描

class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
base = strs[0]
for i in range(len(base)):
# 固定字符串i 检查字符串的第i个字符师傅匹配
for s in strs[1:]:
if i >= len(s) or s[i] != base[i]:
# 检测是否越界 是否相等 如果不相等则按照i切片输出
return base[:i]
return base
使用第一个字符串 遍历每一个字符 逐个字符与其他字符串比较 错误暂停 结果即为答案
有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
class Solution:
def isValid(self, s: str) -> bool:
if len(s) % 2 == 1:
return False
stack = []
pairs = {'(':')','[':']','{':'}'}
for char in s:
if char in pairs:
stack.append(char)
else:
if not stack or pairs[stack.pop()] != char:
return False
return not stack
建立一个字典,左括号为key,遍历字符串,判断是否为左括号如果是则推入栈,如果不是则使用顶栈作为key判断出对应右括号是否相等,如不等则返回False,否则继续判断,全部判断完成后检查栈是否为空(通过pop弹栈操作会将输出的栈删除)如果为空 返回true,如果不是则返回false代表栈中还有左括号,没有完成匹配
3330. 找到初始输入字符串 I
Alice 正在她的电脑上输入一个字符串。但是她打字技术比较笨拙,她 可能 在一个按键上按太久,导致一个字符被输入 多次 。
尽管 Alice 尽可能集中注意力,她仍然可能会犯错 至多 一次。
给你一个字符串 word ,它表示 最终 显示在 Alice 显示屏上的结果。
请你返回 Alice 一开始可能想要输入字符串的总方案数。
class Solution:
def possibleStringCount(self, word: str) -> int:
n,l =len(word),1
for i in range(1,n):
if word[i-1] == word[i]:
l += 1
return l
1768. 交替合并字符串
给你两个字符串 word1 和 word2 。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。
返回 合并后的字符串 。
func mergeAlternately(word1 string, word2 string) string {
return u(word1,word2)
}
func u(x string, y string) string{
s1 := []rune(x)
s2 := []rune(y)
miniLen := len(s1)
if len(s2) < miniLen {
miniLen = len(s2)
}
var builder strings.Builder
for i := 0; i < miniLen; i++ {
builder.WriteRune(s1[i])
builder.WriteRune(s2[i])
}
if len(s1) > miniLen {
builder.WriteString(string(s1[miniLen:]))
} else if len(s2) > miniLen {
builder.WriteString(string(s2[miniLen:]))
}
return builder.String()
}
偷懒了 直接用strings.Builder解决 长度最小的字符串做穿插 而后用找出最常的截出多余的字符拼接
389. 找不同
给定两个字符串 s 和 t ,它们只包含小写字母。
字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。
请找出在 t 中被添加的字母。
func findTheDifference(s string, t string) byte {
return u(s,t)[0]
}
func u(s string, t string) string {
s1 := s
s2 := t
x := 0
x2 := 0
for _, v := range s1 {
x = x + int(v)
}
for _, v := range s2 {
x2 = x2 + int(v)
}
if x2 > x {
y := x2 - x
return string(y)
} else {
y := x - x2
return string(y)
}
}
一个很巧的方法,计算两个字符串ascii之和相减,差转为字符就是多余字符