1. 刪除字符串s1 中在字符串s2 中出現的字符。
基本思路:把s1的字符存到一個set里面,然后遍歷s2,看是否出現過,出現過就erase掉。但是直接輸出set的元素這樣會改變順序,要想順序不變,就順序遍歷一下s1 看是否出現,出現就輸出。
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <vector> #include <set> #include <queue> #include <map>
using namespace std; typedef long long LL; const int maxn=1005; set<char>s; int main() { string s1,s2; cin>>s1>>s2; int len=s1.length(); for(int i=0;i<len;i++) s.insert(s1[i]); len=s2.length(); for(int i=0;i<len;i++) { if(s.count(s2[i])) s.erase(s.find(s2[i])); } len=s1.length(); for(int i=0;i<len;i++) { if(s.count(s1[i])) cout<<s1[i]; } cout<<endl; return 0; }
2. 有序鏈表合並
LeetCode原題:遞歸解決,終止條件:l1為空或者l2位空(同時為空已經在l1那里判斷了)
l1的值比較小或者兩個值相等,就把l1->next和l2合並,放進l1->next,返回l1;
l2的值比較小,就把l1和l2->next合並,放進l2->next,返回l2;
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */
class Solution { public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { if (l1 == NULL) { return l2; } else if (l2 == NULL) { return l1; } else { if (l1->val <= l2->val) { l1->next = mergeTwoLists(l1->next, l2); return l1; } else { l2->next = mergeTwoLists(l1, l2->next); return l2; } } } };
3. 二叉樹中和為某一值的路徑、
劍指Offer 題,從樹的根節點開始一直到葉子結點所經過的結點形成一條路徑也就是說每條滿足條件的路徑都是以根節點開始,葉子結點結束,如果想得到所有根節點到葉子結點的路徑(不一一定滿足和為某整數的條件),需要遍歷整棵樹,還要先遍歷根節點,所以采用先序遍歷。在這個過程中判斷路徑和,每訪問一個節點,我們都把當前節點保存到路徑中。而且每次當從子節點回到父節點的時候,我們都需要在路徑上刪除子節點。
class Solution { public:
vector<vector<int>> res; vector<int> path; vector<vector<int> > FindPath(TreeNode* root,int expectNumber) { find(root,expectNumber); return res; } void find(TreeNode* root,int sum){ if(root == NULL){ return; } path.push_back(root->val); if(!root->left && !root->right && sum == root->val){ res.push_back(path); } else{ if(root->left){ find(root->left,sum - root->val); } if(root->right){ find(root->right,sum - root->val); } } path.pop_back(); } };
4. 給定整數數組a,O(n)時間求a[i] & a[j] 最大值
暫時沒啥思路。