1. 两数之和
题目地址:力扣1
思路:
基础循环遍历,这个编译器有点问题,非要在下面也写一个return..
代码:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> v;
for(int i=1;i<nums.size();i++)
{
for(int j=0;j<i;j++)
{
if(nums[i]+nums[j]==target)
{
v.push_back(i);
v.push_back(j);
return v;
}
}
}
return v;
}
};
2. 两数相加
题目地址:力扣2
思路:
就是模拟加减运算,注意进位就好。
以及每一个新的结点都要new一下。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* 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) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* l3;
ListNode* t=new ListNode(0);
l3=t;
while(l1&&l2)
{
t->val=t->val+l1->val+l2->val;
ListNode* p;
if(t->val>=10)p=new ListNode(t->val/10);
else p=new ListNode(0);
t->val=t->val%10;
l1=l1->next;
l2=l2->next;
if(l1||l2){
t->next=p;
t=t->next;
}
}
ListNode* p;
while(l1)
{
t->val=t->val+l1->val;
if(t->val>=10)p=new ListNode(t->val/10);
else p=new ListNode(0);
t->val=t->val%10;
if(l1->next){
t->next=p;
t=t->next;
}
l1=l1->next;
}
while(l2)
{
t->val=t->val+l2->val;
if(t->val>=10)p=new ListNode(t->val/10);
else p=new ListNode(0);
t->val=t->val%10;
if(l2->next){
t->next=p;
t=t->next;
}
l2=l2->next;
}
if(p->val!=0){
t->next=p;
}
return l3;
}
};
3. 无重复字符的最长子串
题目地址:力扣3
思路:
改了好久。。小细节一直错。
三层循环来做这题。
以pwwkew为例,我们肉眼去看的思路是
p
pw
w
w
wk
wke
k
ke
kew
所以用代码模拟就好啦
代码:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s=="")return 0;
if(s.length()==1)return 1;
int t=1;
int sum=1;
int g=0;
for(int i=0;i<s.length();i++)
{
t=1;
for(int j=i+1;j<s.length();j++)
{
for(int k=i;k<j;k++)
{
if(s[j]==s[k]){
sum=max(sum,t);
g=1;
break;
}
}
if(g==1){
g=0;
break;
}
t++;
sum=max(sum,t);
}
}
//sum=max(sum,t);
return sum;
}
};
4. 寻找两个正序数组的中位数
题目地址:力扣4
思路:
不理解为什么这题标记为困难,这就是最简单的把两个递增序列合并成一个递增序列。
最后求一下中位数就好了。
代码:
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
vector<int> nums3;
int i=0;
int j=0;
while(i<nums1.size()&&j<nums2.size()){
if(nums1[i]<nums2[j]){
nums3.push_back(nums1[i]);
i++;
}
else{
nums3.push_back(nums2[j]);
j++;
}
}
while(i<nums1.size())
{
nums3.push_back(nums1[i]);
i++;
}
while(j<nums2.size())
{
nums3.push_back(nums2[j]);
j++;
}
int w;
if((nums1.size()+nums2.size())%2==0){
w=(nums1.size()+nums2.size())/2;
return (nums3[w-1]+nums3[w])/2.0;
}
else{
w=(nums1.size()+nums2.size())/2;
return nums3[w];
}
}
};
5. 最长回文子串
题目地址:力扣5
思路:
暴力过不去,所以用了动态规划。
dp[i][j]代表s[i][j]是否是回文数。
首先初始化dp数组,所有dp[i][i]都是1.
当i~j长度为2以及2以内时,只要s[i]==s[j],则它就是回文数,所以dp[i][j]=1.
当长度大于2的时候,我们要看里面的结构,dp[i+1][j-1]是否为1,如果为1说明它里面就是个回文数,比较两端是否相等即可。s[i]==s[j]则dp[i][j]=1。
代码:
class Solution {
public:
string longestPalindrome(string s) {
if(s.size()==1)return s;
string c=s.substr(0,1);
int len=1;
int st=0;
int dp[1001][1001];
memset(dp,0,sizeof(dp));
for(int i=0;i<s.length();i++)
{
dp[i][i]=1;
}
for(int i=1;i<s.length();i++)
{
for(int j=0;j<i;j++)
{
if(s[i]==s[j])
{
if(i-j+1<=2)dp[j][i]=1;
else{
dp[j][i]=dp[j+1][i-1];
}
}
if(dp[j][i]){
if(i-j+1>len)
{
len=i-j+1;
st=j;
}
}
}
}
return s.substr(st,len);
}
};