#include<iostream>#include<string>#include<unordered_set>#include<algorithm>usingnamespace std;classSolution{public:intlengthOfLongestSubstring(string s){/*依次对每一个字母为起点,找到最长子串,然后取最长
*/
unordered_set<char> occ;int n = s.length();int right =0, ans =0;for(int left =0; left < n;++left){if(left !=0){
occ.erase(s[left -1]);}while(right < n &&!occ.count(s[right])){
occ.insert(s[right]);++right;}
ans =max(ans, right - left);}return ans;}};intmain(){
string s;
Solution s1;getline(cin, s);int ans;
ans = s1.lengthOfLongestSubstring(s);
cout << ans;return0;}
classSolution{public:boolisPalindrome(int x){//转成字符串然后反转
string s =to_string(x);return s ==string(s.rbegin(),s.rend());}};
9. 盛最多水的容器
#include<iostream>#include<vector>#include<unordered_map>#include<algorithm>usingnamespace std;classSolution{public:intmaxArea(vector<int>& height){//双指针,每次只挪更短的那根木板int ans =0, left =0, right = height.size()-1;while(left < right){if(height[left]<= height[right]){
ans =max(ans,(right - left)* height[left]);
left++;}else{
ans =max(ans,(right - left)* height[right]);
right--;}}return ans;}};intmain(){
vector<int> nums ={1,8,6,2,5,4,8,3,7};int ans =0;
Solution s1;
ans = s1.maxArea(nums);
cout << ans << endl;return0;}
10. 整数转罗马数字
classSolution{public:
string intToRoman(int num){
vector<int> values ={1000,900,500,400,100,90,50,40,10,9,5,4,1};
vector<string> reps ={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
string res;for(int i =0; i <13;++i){while(num >= values[i]){
num -= values[i];
res += reps[i];}}return res;}};
11. 罗马数字转整数
classSolution{private:
unordered_map<char,int> symbolValues ={{'I',1},{'V',5},{'X',10},{'L',50},{'C',100},{'D',500},{'M',1000},};public:intromanToInt(string s){/*通常情况下,罗马数字中小的数字在大的数字的右边。若输入的字符串满足该情况,那么可以将每个字符视作一个单独的值,累加每个字符对应的数值即可。
例如 XXVII = X+X+V+I+I=10+10+5+1+1=27。
若存在小的数字在大的数字的左边的情况,根据规则需要减去小的数字。对于这种情况,我们也可以将每个字符视作一个单独的值,若一个数字右侧的数字比它大,则将该数字的符号取反。
例如 XIV = X−I+V=10−1+5=14。
*/int ans =0;int n = s.length();for(int i =0; i < n;++i){int value = symbolValues[s[i]];if(i < n -1&& value < symbolValues[s[i +1]]){
ans -= value;}else{
ans += value;}}return ans;}};
12. 最长公共前缀
classSolution{public:
string longestCommonPrefix(vector<string>& strs){int n = strs.size();if(n ==0){return"";}int length = strs[0].size();for(int i =0; i < length;++i){char c = strs[0][i];for(int j =1; j < n;++j){if(i == strs[j].size()|| strs[j][i]!= c){return strs[0].substr(0, i);}}}return strs[0];}};
13. 三数之和
#include<iostream>#include<vector>#include<unordered_map>#include<algorithm>usingnamespace std;classSolution{public:
vector<vector<int>>threeSum(vector<int>& nums){int n = nums.size();sort(nums.begin(), nums.end());
vector<vector<int>> ans;for(int first =0; first < n;++first){if(first >0&& nums[first]== nums[first -1]){continue;}if(nums[first]>0){break;}int third = n -1;for(int second = first +1; second < n;++second){if(second > first +1&& nums[second]== nums[second -1]){continue;}while(second < third && nums[first]+ nums[second]+ nums[third]>0){--third;}if(second == third){break;}if(nums[first]+ nums[second]+ nums[third]==0){
ans.push_back({nums[first], nums[second], nums[third]});}}}return ans;}};intmain(){
vector<int> nums ={-1,0,1,2,-1,-4};
vector<vector<int>> ans;
Solution s1;
ans = s1.threeSum(nums);int n = ans.size();int m = ans[0].size();for(int i =0; i < n;++i){for(int j =0; j < m;++j){
cout << ans[i][j]<<" ";}}return0;}
14. 最接近的三数之和
classSolution{public:intthreeSumClosest(vector<int>& nums,int target){int n = nums.size();sort(nums.begin(), nums.end());int ans = nums[0]+ nums[1]+ nums[2];for(int i =0; i < n;++i){int start = i +1, end = n -1;while(start < end){int sum = nums[start]+ nums[end]+ nums[i];if(abs(ans - target)>abs(sum - target)){
ans = sum;}if(sum > target){
end--;}elseif(sum < target){
start++;}else{return ans;}}}return ans;}};
15. 电话号码的字母组合
#include<iostream>#include<string>#include<vector>#include<algorithm>usingnamespace std;classSolution{public:
string temp;
vector<string> res;
vector<string> board ={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};voidDFS(int pos, string digits){if(pos == digits.size()){
res.push_back(temp);return;}int num = digits[pos]-'0';for(int i =0; i < board[num].size();++i){
temp.push_back(board[num][i]);DFS(pos +1, digits);
temp.pop_back();//移除容器中的最后一个元素}}
vector<string>letterCombinations(string digits){if(digits.size()==0){return res;}DFS(0, digits);return res;}};intmain(){
string s;
Solution s1;getline(cin, s);
vector<string> ans;
ans = s1.letterCombinations(s);for(int i =0; i < ans.size();++i){
cout << ans[i]<< endl;}return0;}
16. 四数之和
classSolution{public:
vector<vector<int>>fourSum(vector<int>& nums,int target){sort(nums.begin(),nums.end());
vector<vector<int>> res;if(nums.size()<4)return res;int a,b,c,d,_size = nums.size();for( a =0;a <= _size -4;a++){if(a >0&& nums[a]== nums[a-1])continue;//确保nums[a] 改变了for( b = a +1; b <= _size -3; b++){if( b > a +1&& nums[b]== nums[b-1])continue;//确保nums[b] 改变了
c=b+1,d=_size-1;while(c<d){if(nums[a]+nums[b]-target <-(nums[c]+nums[d]))//原写法num[a]+num[b]+num[c]+num[d]<target为了防止溢出,见下面的补充修改
c++;elseif(nums[a]+nums[b]-target>-(nums[c]+nums[d]))//同上
d--;else{
res.push_back({nums[a],nums[b],nums[c],nums[d]});while(c<d&&nums[c+1]==nums[c])//确保nums[c] 改变了
c++;while(c<d&&nums[d-1]==nums[d])//确保nums[d] 改变了
d--;
c++;
d--;}}}}return res;}};
17. 删除链表的倒数第 N 个结点
#include<iostream>#include<vector>#include<unordered_map>usingnamespace std;structListNode{int val;
ListNode* next;ListNode():val(0),next(nullptr){}ListNode(int x):val(x),next(nullptr){}ListNode(int x, ListNode *next):val(x),next(next){}};classSolution{public://创建顺序链表
ListNode*creatNode(int n){
ListNode* headnode =newListNode();//申请动态空间;
headnode->next =nullptr;
ListNode* p = headnode;while(n--){
ListNode* q =newListNode();
cin >> q->val;
q->next = p->next;
p->next = q;
p = q;//每次把头结点后移,重复上面操作;}return headnode;}//打印链表voidprintList(ListNode* headnode){
ListNode* pmove = headnode->next;while(pmove){
cout << pmove->val <<" ";
pmove = pmove->next;}if(!pmove){
cout << endl;}}//删除链表的倒数第 N 个结点
ListNode*removeNthFromEnd(ListNode* head,int n){if(!head){return head;}int length =0;
ListNode* dummy1 = head;while(dummy1){++length;
dummy1 = dummy1->next;}
ListNode* dummy =newListNode(0, head);
ListNode* cur = dummy;for(int i =1; i < length - n +1;++i){
cur = cur->next;}
cur->next = cur->next->next;
ListNode* ans = dummy->next;delete dummy;return ans;}};intmain(){int n =0, m =2;
Solution s1;
ListNode* List1,*res;
cin >> n;
List1 = s1.creatNode(n);
s1.printList(List1);
res = s1.removeNthFromEnd(List1, m);
s1.printList(res);system("pause");return0;}