首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >leetcode刷题系列/2

leetcode刷题系列/2

作者头像
用户9831583
发布2022-06-16 16:11:40
发布2022-06-16 16:11:40
3660
举报
文章被收录于专栏:码出名企路码出名企路

4.罗马数字转整数

定义见代码,示例:

输入

输出

IV

4(1在5的左边,大数减小数)

LVIII

58(小数在左,大数在右,50+5+3)

III

3

代码:

代码语言:javascript
复制

#include <iostream>
#include <unordered_map>
#include <string>
#include <memory>
using namespace std;

// int main()
// {
//     string input="XII";
//     unordered_map<char,int> optional = {{'I',1},{'V',5},{'X',10},{'L',50},{'C',100},{'D',500},{'M',1000}};
//     int sum = 0;
//     for(int i=0; i<input.size();++i)
//     {
//         optional[input[i]] < optional[input[i+1]] ? sum-=optional[input[i]]:sum+=optional[input[i]];
//     }
//     cout<<sum<<endl;
// }

int main()
{
     string input="XII";
     int op[90]={};
     op['I']=1;
     op['V']=5;
     op['X']=10;
     op['L']=50;
     op['C']=100;
     op['D']=500;
     op['M']=1000;

      int sum = 0;
    for(int i=0; i<input.size();++i)
    {
        op[input[i]] < op[input[i+1]] ? sum-=op[input[i]]:sum+=op[input[i]];
    }
    cout<<sum<<endl;
}

5,最长公共前缀

示例:

输入

输出

["flower","flow","flight"]

fl

["dog","race","car"]

""不存在

代码:

代码语言:javascript
复制
#include <iostream>
#include <unordered_map>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
//最长公共子串

// int main()
// {
//     vector<string> strs={{"adfgh"},{"adfvbg"},{"adcv"}};

//     if(strs.empty())
//         return 0;
//     const auto p=minmax_element(strs.begin(),strs.end());
//     for(int i=0;i<p.first->size();++i)
//     {
//         if(p.first->at(i) != p.second->at(i))
//             cout<< p.first->substr(0,i)<<endl;
   
//     }
//     //cout<< *p.first<<endl;
// }


int main()
{
    vector<string> strs={{"adfgh"},{"adfvbg"},{"adcv"}};

    string res = strs.empty()? 0 : strs[0];
    for(string s: strs)
    {
        while(s.find(res) !=0)
            res=res.substr(0,res.length()-1);
    }
    cout<<res<<endl;
}

6,合并两个有序链表

示例:

输入

输出

1->2->4, 1->3->4

1->1->2->3->4->4

程序:

代码语言:javascript
复制
#include <iostream>
using namespace std;
#include <fstream>

//合并两个有序链表

//链表创建及初始化
struct List{
    double value;
    List *next;
    List(double _value,List *_next=NULL){
        value = _value;
        next = _next;
    }
};

//合并
List* merge(List *nl1,List *nl2)
{
    if(!nl1) return nl2;
    if(!nl2) return nl1;
    List* merger=nullptr;
    if(nl1->value < nl2->value )
    {   
        merger=nl1;
        merger->next= merge(nl1->next,nl2);
    }
    else
    {   
        merger=nl2;
        merger->next= merge(nl1,nl2->next);
    }
    return merger;
}


int main()
{
    double n1,n2;
    List *nl1 =NULL,*nl2=NULL;
    ifstream nf1("nf1.txt");
    ifstream nf2("nf2.txt");
    if(!nf1 || !nf2)
    {
        return 0;
    }

    while(nf1>>n1)//????
    {
        cout<<n1<<" ";
        nl1= new List(n1,nl1);
    }
    cout<<endl;
    //   while (nl1 !=NULL)
    // {
    //     cout<< nl1->value<<" ";
    //     nl1=nl1->next;
    // }
    // cout<<endl;

    while(nf2>>n2)
    {
        cout<<n2<<" ";
        nl2= new List(n2,nl2);
    }
    cout<<endl;
    //   while (nl2 !=NULL)
    // {
    //     cout<< nl2->value<<" ";
    //     nl2=nl2->next;
    // }
    //  cout<<endl;

    List* re = merge(nl1,nl2);//???????
    if(re == NULL)
        cout<<"000"<<endl;
    while (re !=NULL)
    {
        cout<< re->value<<" ";
        re=re->next;
    }
    
}

7,删除数组中重复项

示例:

输入

输出

[1,2,3,3]

1,2,3

0,0,1,1,2,2,3,3

0,1,2,3

代码:

代码语言:javascript
复制
//删除数据中重复数字
#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>
// int main()
// {
//     vector<int> nums{0,0,1,2,3,3,4,5,5,6};
//     int size=nums.size();
//     int cnt=0;
//     //统计当前元素需要前移的位置 不需要移动整个数组
//     for(int i=1;i<size;++i){
//        if(nums[i] == nums[i-1])
//             cnt++;
//         nums[i-cnt] = nums[i];//向前移动cnt个位置
//     }
//     for(auto num:nums)
//         cout<<num<<" ";
//     cout<<endl;
//      for(int num=0; num<size-cnt; num++)
//         cout<<nums[num]<<" ";
//  }

 int main()
{
    vector<int> nums{0,0,1,7,3,3,4,5,5,6};
    //unique之前先排序
    sort(nums.begin(),nums.end());
    //返回一个迭代器,指向去重后容器中不重复序列的最后一个元素的下一个元素
    //并不是真的删除,重复元素的位置被不重复的占领了
    auto end_unique = unique(nums.begin(),nums.end());//nums={0,1,2,3,4,5,6,5,5,6}
    nums.erase(end_unique,nums.end());

    for(auto num:nums)
        cout<<num<<" ";
 }

8,原低移除数组中等于val的元素

示例:

输入

输出

[3,2,2,3] val=3

返回剩余长度2

[0,1,2,2,3,0,4,2]val=2

返回剩余长度5

代码:

代码语言:javascript
复制
#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>
#include <iterator>//distance
#include <functional>
#include <bits/stdc++.h>


//移出重复元素,并返回长度
//  int main()
//  {
//      vector<int> nums{0,0,1,2,3,3,4,5,5,7};
//      int val=5;
//      for(int i=nums.size()-1; i >= 0; i--)
//      {
//          if(nums[i] == val)
//          {
//              for(int j=i; j<nums.size();j++)
//              {
//                  nums[j] = nums[j+1];
//              }
//              nums.pop_back();
//          }
//      }
//      for(auto num:nums)
//              cout<<num<<" ";
//      cout<<nums.size()<<endl;
//  }


//   int main()
//  {
//      vector<int> nums{0,0,1,2,3,3,4,5,5,7};
//      int val=5;
//      for(auto it=nums.begin();it!=nums.end();it++)
//      {
//          if(*it ==val)
//             nums.erase(it--);//it指向删除后的元素 但循环还会指针+1 要自减防止跳数
//      }

//    for(auto num:nums)
//             cout<<num<<" ";
//      cout<<nums.size()<<endl;

 //}


   int main()
{
     vector<int> nums={0,0,1,2,3,3,4,5,5,7};
     int val=5;
     
     //它接受一个谓词,对容器进行划分,使得谓词为true的值会排在容器的前半部分,而谓词为false的值会排在后半部分。
     //算法返回一个迭代器,指向最后一个使谓词为true的元素之后的位置
     cout<< distance(nums.begin(),partition(nums.begin(),nums.end(), [=](const int&a ){
         return a!=val;
     }));//????

 }

9,最大子序列和

示例:

输入

输出

[-2,-1,-3,4,-1,2,1,-5,4]

[4,-1,2,1] 6

[-1,0,1]

1

代码:

代码语言:javascript
复制
#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>
#include <climits>

//最大子序列和

//暴力
int maxSum1(vector<int> &nums)
{
    int max=INT_MIN;
    int numsize = int(nums.size());
    for(int i=0; i<numsize;i++)
    {
        int sum=0;
        for(int j=i; j<numsize;j++)
        {
            sum+=nums[j];
            if(sum > max)
            {
                max =sum;
            }
        }
    }

    return max;
}

//动态规划
int maxSum2(vector<int> &nums)
{
    int result=INT_MIN;
    int numsize = int(nums.size());
    //dp[i]表示nums中以nums[i]结尾的最大子序号
    vector<int> dp(numsize);
    dp[0] =nums[0];
    result =dp[0];
    for(int i=1; i<numsize;i++)
    {
        dp[i]=max(dp[i-1]+nums[i],nums[i]);
        result=max(result,dp[i]);
    }
    return result;
}


int main()
{
    vector<int> nums={-1,2,3,4,5,6,7};
    int res1=maxSum1(nums);
    cout<<res1<<endl;

    int res2=maxSum2(nums);
    cout<<res2<<endl;
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-26,如有侵权请联系 cloudcommunity@tencent.com 删除
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档