leetcode刷题开始啦, 每天记录几道题.
让我们实现一个函数, 把字符串 s 中的每个空格替换为 %20.
这个题目我只能想到遍历, 在空间控制上应该有原地修改的办法会省一些.
如果用python, 那直接用split一类的命令就可以了. 但没有必要, 我们直接遍历, 效果也差不多.
class Solution:
def replaceSpace(self, s: str) -> str:
result = ""
for i, char in enumerate(s):
if char == ' ':
result += "%20"
else:
result += char
return result
C++的字符串也支持+这个操作, 所以也是类似的.
class Solution {
public:
string replaceSpace(string s) {
string result = "";
for (int iter=0; iter < s.size(); iter++){
if (s[iter] == ' '){
result += "%20";
}
else{
result += s[iter];
}
}
return result;
}
};
时间复杂度是 O ( n ) O(n) O(n), 因为要遍历整个字符串; 空间复杂度是 O ( n ) O(n) O(n), 存储原字符串, 和新建一个字符串.
输入一个链表的头节点, 从尾到头反过来返回每个节点的值(用数组).
一个想法是反转链表, 再顺序给出每个节点的值. 进一步想, 如果递归的方式反转链表, 就要先走到链表的尾部再从尾到头接上, 那何不在第二个过程里直接返回值呢. 再进一步想, 那何不直接用递归的方式呢?
class Solution:
def reversePrint(self, head: ListNode) -> List[int]:
if head == None:
return []
if head.next == None:
return [head.val]
else:
return self.reversePrint(head.next) + [head.val]
我一定不用递归, 那怎么办? 可以用栈, 先进后出, 顺序读链表每个元素, 压入栈, 再把栈里的元素一个个弹出来.
python 没有栈的数据结构, 我们可以用两个数组来自己完成.
class Solution:
def reversePrint(self, head: ListNode) -> List[int]:
result = []
if head == None:
return result
temp = []
while head != None:
temp.append(head.val)
head = head.next
while temp:
result.append(temp.pop())
return result
C++有栈这个数据结构stack, 我们可以直接用一下.
class Solution {
public:
vector reversePrint(ListNode* head) {
vector result;
if (head == NULL){
return result;
}
stack temp;
while (head != NULL){
temp.push(head->val);
head = head->next;
}
while (!temp.empty()){
result.push_back(temp.top());
temp.pop();
}
return result;
}
};
这个时间复杂度是 O ( n ) O(n) O(n), 两次遍历; 空间复杂度也是 O ( n ) O(n) O(n), 要开辟两个和链表等长的空间.