leetcode图解算法数据结构---数据结构
05 替换空格
解题思路:
字符串是不可变类型,本题中需要替换字符串中的某个字符,可以使用replace方法直接替换;以下是遍历字符串的方式进行求解的,逐个判断字符串中的字符是否为空,若为空,将新字符串添加相应字符串;否则添加原来字符。该方法的时间复杂度为o(n)
代码:
class Solution:
def replaceSpace(self, s: str) -> str:
# return s.replace(' ', '%20')
tmp = ''
for i in range(len(s)):
tmp += '%20' if s[i] == ' ' else s[i]
return tmp
class Solution {
public String replaceSpace(String s) {
StringBuilder res = new StringBuilder(); // 可变的字符串对象,没有线程安全
for(Character c : s.toCharArray()){
// for写法,字符串转字符列表
if(c == ' '){
res.append("%20");} // 双引号
else{
res.append(c);}
}
return res.toString();
}
}
在Java和python3中,string都是不可变类型,需要增加新变量来得到最后的结果。而C++是可变类型,通过s.resize()
可以改变字符串长度,按照空格数改变字符串长度,然后从后往前寻找空格,往相应地方添加题目中要求的字符。
class Solution {
public:
string replaceSpace(string s) {
// 首先先确定空格的数量,然后更改字符串的长度,用两个指针从后往前遍历,如果遇到空格,从后往前将20%写上
int len = s.size();
int count = 0;
for(char c : s){
if(c == ' '){
// C++中单字符用单引号
count++;
}
}
s.resize(len + count * 2);
for(int i=len-1,j=s.size()-1;i<j;j--,i--){
if(s[i] == ' '){
s[j] = '0';
s[j-1] = '2';
s[j-2] = '%';
j -= 2;
}else{
s[j] = s[i];
}
}
return s;
}
};
06 从尾到头打印链表
我的思路就是逐个读取链表节点的value得到一个list,然后逆序输出list即可,时间复杂度和空间复杂度都是o(n)
class Solution:
def reversePrint(self, head: ListNode) -> List[int]:
result = []
# 正序读取O(n)
while head is not None: # 可以简写为:while head:
result.append(head.val)
head = head.next
# list逆序输出,下标操作
return [result[len(result)-i-1] for i in range(len(result))]
# python中list逆序可以直接通过切片实现
# return result[::-1]
解题方法:
- 递归回溯法:
若head不是空,那么逐个遍历链表,直到head为空时,再依次回溯回去。在python的代码中,我认为self.reversePrint()
本身就是一个递归的机制,表示求某条链表的逆序。
return self.reversePrint(head.next) + [head.val] if head else []
- 辅助栈法:
由于本题是单链表,需要逆序输出值,考虑到栈先进后出的原则,考虑用栈来解决此题。以上我的思路就是这种方法,在python中,使用list就足够。在Java中,需要使用LinkedList<Integer> stack = new LinkedList<Integer>()
定义一个栈,然后stack.removeLast()
出栈存储值。
09 用两个栈实现队列
首先,明确队列和栈的工作方式。队列是“先进先出”,栈是“先进后出”。本题需要完成两个功能,分别是添加和删除,即往队尾添加新元素,删除队首的元素。如果用一个栈来完成队列的操作,添加元素时,直接添加即可;删除元素时,弹出最后一个值(栈底元素)就需要逐个弹出所有元素。那么可以用一个栈完成添加操作,另一个栈逆序存储列表顺序,完成删除操作。在python中,可以直接用list作为栈。
class CQueue:
def __init__(self):
# 初始化队列,即两个空栈
self.A, self.B = [], []
def appendTail(self, value: int) -> None: