题目链接:https://leetcode-cn.com/problems/add-two-numbers/
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int num=(l1->val+l2->val)%10;
int div=(l1->val+l2->val)/10;
ListNode *head=new ListNode(num);
ListNode *l3=head;
l1=l1->next;
l2=l2->next;
while(l1&&l2)
{
num=(div+l1->val+l2->val)%10;
div=(div+l1->val+l2->val)/10;
l3->next=new ListNode(num);
l3=l3->next;
l1=l1->next;
l2=l2->next;
}
//如果l1还没有遍历完
while(l1)
{
num=(div+l1->val)%10;
div=(div+l1->val)/10;
l3->next=new ListNode(num);
l3=l3->next;
l1=l1->next;
}
//如果l2还没有遍历完
while(l2)
{
num=(div+l2->val)%10;
div=(div+l2->val)/10;
l3->next=new ListNode(num);
l3=l3->next;
l2=l2->next;
}
if(div!=0)
{
l3->next=new ListNode(div);
l3=l3->next;
}
return head;
}
};
有点像merge2个有序链表的操作,注意进位即可
题目链接:https://leetcode-cn.com/problems/longest-palindromic-substring/
博客指路
题目链接:https://leetcode-cn.com/problems/string-to-integer-atoi/
class Solution {
public:
int deal_with_cal(string &str,int index)
{
//首先判断,刚开始的加减符号是不是最后一个字符或者加减符号后是否不是数字
//如果满足任意一种情况都直接返回0
if(index+1>=str.size()||(str[index+1]<'0'||str[index+1]>'9'))
return 0;
//记录标点符号
bool minus=false;
if(str[index]=='-')
minus=true;
long long num=0;
for(int i=index+1;i='0'&&str[i]<='9')
{
num=num*10+(str[i]-'0');
//如果超出负数范围
if(minus&&(num-1>INT_MAX))
return INT_MIN;
else if(!minus&&(num>INT_MAX))
return INT_MAX;
}
else
break;
}
if(minus)
return num*(-1);
else
return num;
}
int deal_with_num(string &str,int index)
{
long long num=0;
for(int i=index;i='0'&&str[i]<='9')
{
num=num*10+(str[i]-'0');
//如果超出范围
if(num>INT_MAX)
return INT_MAX;
}
else
break;
}
return num;
}
int myAtoi(string str) {
if(str.size()==0)
return 0;
for(int i=0;i='0'&&str[i]<='9')
{
return deal_with_num(str,i);
}
//不是加减或数字
else
{
return 0;
}
}
return 0;
}
};
注意有一句代码:num-1>INT_MAX这句并不可以写成num>1+INT_MAX,因为1+INT_MAX会变为INT_MIN
题目链接:https://leetcode-cn.com/problems/container-with-most-water/
class Solution {
public:
int maxArea(vector& height) {
if(height.size()==2)
return height[0]>height[1]?height[1]:height[0];
int maxw=0;
int i=0,j=height.size()-1;
while(iheight[i]?height[i]:height[j]);
if(temw>maxw)
maxw=temw;
if(height[j]>height[i])
i++;
else
j--;
}
return maxw;
}
};
从2头往中间挤,当间距在缩小时,要想获得最大容量必须使最低木板变高,才有可能得到最大值。
题目链接:https://leetcode-cn.com/problems/3sum/
class Solution {
public:
vector> threeSum(vector& nums) {
vector> vt;
if(nums.size()<3)
return vt;
sort(nums.begin(),nums.end());
map mp;
for(int i=0;i0)
return vt;
//如果之前处理过这个数,不再处理
if(mp[nums[i]])
continue;
mp[nums[i]]++;
int lptr=i+1;
int rptr=nums.size()-1;
while(lptr {nums[i],nums[lptr],nums[rptr]});
do
{
lptr++;
}while(nums[lptr-1]==nums[lptr]&&lptr0)
{
do
{
rptr--;
}while(nums[rptr+1]==nums[rptr]&&lptr
先排序,然后从左到右依次固定住一个数作为第一个数,之后选另外2个数(用左右夹击的方法),如果该数满足要注意之后的去重。
题目链接:https://leetcode-cn.com/problems/3sum-closest/
class Solution {
public:
int threeSumClosest(vector& nums, int target) {
if(nums.size()==3)
return nums[0]+nums[1]+nums[2];
sort(nums.begin(),nums.end());
//为正
if(target&&nums[nums.size()-1]<=0)
return nums[nums.size()-1]+nums[nums.size()-2]+nums[nums.size()-3];
if(!target&&nums[0]>=0)
return nums[0]+nums[1]+nums[2];
int res;
int abs_minus_min=INT_MAX;
int j=nums.size()-1;
for(int i=0;i0)
rptr--;
else if(temp_minus<0)
lptr++;
else
return res;
}
}
return res;
}
};
差不多的套路,只是不用去重而已,因为最后答案只有一个。