一、数据结构
-
剑指05,替换空格
//时间O(n),空间O(1) //计算空格数目,预分配空间,双指针 class Solution { public: string replaceSpace(string s) { if(s.empty()) return s; int cnt = 0; for(size_t i=0;i<s.size();++i) { if(s[i] == ' ') ++cnt; } int i = s.size()-1; s.resize(s.size()+2*cnt); int j = s.size()-1; while(i != j) { if(s[i] != ' ') { s[j--] = s[i--]; } else { --i; s[j--] = '0'; s[j--] = '2'; s[j--] = '%'; } } return s; } };
-
剑指06,逆序打印链表
//时间O(n),空间O(n) //计算链表长度,创建大小相同的数组,逆序放入数组,速度快 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: vector<int> reversePrint(ListNode* head) { auto p = head; int cnt = 0; while(p) { ++cnt; p = p->next; } p = head; vector<int> vec(cnt); while(p) { vec[--cnt] = p->val; p = p->next; } return vec; } }; //时间O(n),空间O(n) //递归,回溯使用了栈,速度慢 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: vector<int> reversePrint(ListNode* head) { recur(head); return vec; } private: vector<int> vec; void recur(ListNode* head) { if(!head) return; recur(head->next); vec.push_back(head->val); } };
-
剑指09,双栈实现队列
//分清楚情况 class CQueue { public: stack<int> st1; stack<int> st2; CQueue() {} void appendTail(int value) { st1.push(value);