1.(leetcode13)给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。
解题思路
- 使用字典存储罗马字符-数字{key:value}
- 从左开始遍历每个罗马字符,若左边大,则相加;若左边小,则相减
- 若罗马字符长度为1,即单个字符,则直接输出key对应的value值
代码实现
class Solution:
def romanToInt(self , s ):
dic ={'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
result =0
length =len(s)
i=0
while i <length-1:
if dic[s[i]] >=dic[s[i+1]]:
result +=dic[s[i]]
i+=1
else:
temp =dic[s[i+1]]-dic[s[i]]
result +=temp
i =i+2
if length-1 ==i:
result+=dic[s[i]]
if result >=1 and result <=3999:
return result
else:
return False
2. 请设计并实现一个caseTransform函数,使得一个字符串str可以被方便地转成四种形式,并且将四种形式通过空格拼接成一个字符串返回
3.查找二叉搜索树的叶子节点
给一个二叉查找树(Binary Search Tree)的前序遍历结果数组,打印出所有的叶子节点
4. (leetcode678)有效的括号字符串
‘解题思路
- 用双栈,左栈和右栈,左括号和*都分别入左栈,右栈
- 遇到右括号,如果有尚未匹配的左括号,先与左栈栈顶的左括号匹配(左栈pop)
- 如果有尚未消耗的*,则出栈(右栈pop)
代码实现
class Solution:
def checkValidString(self, s: str) -> bool:
stack_left =[]
stack_right = []
for i in range(len(s)): //遍历每一个字符
if s[i] == '(':
stack_left.append(i)
elif s[i] == '*':
stack_right.append(i)
//遇到右括号
elif s[i] ==')':
if stack_left: // 有左括号匹配
stack_left.pop()
elif stack_right: // 有*匹配
stack_right.pop()
else:
return False
while stack_left: // 当左括号非空
if not stack_right:
return False // 没有*匹配
elif stack_left[-1] > stack_right[-1]:
return False // 右栈没有*匹配
else: // 还有匹配项
stack_left.pop()
stack_right.pop()
return True
5.(leetcode206)翻转单向链表
解题思路
- 遍历链表,将当前节点的Next指针改为指向前一个节点
- 由于节点没有存储前一个节点,必须先存储其前一个元素,即curNode将要指向的前一个节点
- 在更改指针之后,需要另一个指针来存储下一个节点,即curNode原本指向的下一个节点
代码实现
// 声明两个指针
preNode =null
curNode = head
while curNode:
temp = curNode.next // 将原来的curNode.next存储起来
curNode.next =preNode // 将指向改变,指向前一个节点
preNode = curNode // 同时将数据域复制给前一个指针
curNode = temp // 将下一个节点赋值给当前节点
return preNode
方法二:递归