算法

1、整数反转

题目

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0
输出:0

代码

class Solution {
public:
    int reverse(int x) {
      if(x==0)
        return 0;
      long int y=0;
      int xx=x;
      while(xx!=0){
        y=y*10+xx%10;
        xx/=10;
      }
      if(y>2147483647 || y<-2147483648){
        return 0;
      }
      return y;
    }
};

2、七进制数

题目

给定一个整数 num,将其转化为 7 进制,并以字符串形式输出。
示例 1:
输入: num = 100
输出: “202”
示例 2:
输入: num = -7
输出: “-10”

代码

class Solution {
public:
    string convertToBase7(int num) {
      if(num==0)
        return "0";
      string s;
      bool is=num<0;
      num = abs(num);
      while(num>0){
        s.push_back(num%7+'0');
        num/=7;
      }
      if(is)
        s.push_back('-');
      reverse(s.begin(), s.end());
      return s;
    }
};

注:
push_back()函数用法:将一个新的元素加到vector的最后面,位置为当前最后一个元素的下一个元素,或者再string中最后插入一个字符;
pop_back() //移除最后一个元素
clear() //清空所有元素
empty() //判断vector是否为空,如果返回true为空
erase() // 删除指定元素
reverse(s.begin(), s.end()); 反转
例如:
vector vec;
vec.push_back(10);
string s ; s.push_back(123+‘0’);

3、 罗马数字转整数

题目

罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。

字符 数值 I 1 V 5 X 10 L
50 C 100 D 500 M 1000 例如, 罗马数字 2
写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5
的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。 X 可以放在 L (50) 和 C (100) 的左边,来表示
40 和 90。 C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。
示例 1:
输入: s = “III”
输出: 3
示例 2:
输入: s = “IV”
输出: 4
示例 3:
输入: s = “IX”
输出: 9
示例 4:
输入: s = “LVIII”
输出: 58
解释: L = 50, V= 5, III = 3.

代码

class Solution {
public:
    int romanToInt(string s) {
      int re=0;
      for(int i=0;i<s.length();i++){
        if(s[i]=='I'&&s[i+1]!='V'&&s[i+1]!='X')
          re+=1;
        else if(s[i]=='I'&&s[i+1]=='V')
          re-=1;
        else if(s[i]=='I'&&s[i+1]=='X')
          re-=1;
        else if(s[i]=='V')
          re+=5;
        else if(s[i]=='X'&&s[i+1]!='L'&&s[i+1]!='C')
          re+=10;
        else if(s[i]=='X'&&(s[i+1]=='L'||s[i+1]=='C'))
          re-=10;
        else if(s[i]=='L')
          re+=50;
        else if(s[i]=='C'&&s[i+1]!='D'&&s[i+1]!='M')
          re+=100;
        else if(s[i]=='C'&&(s[i+1]=='D'||s[i+1]=='M'))
          re-=100;
        else if(s[i]=='D')
          re+=500;
        else if(s[i]=='M')
          re+=1000;
      }
      return re;
    }
};

4、最长公共前缀

题目

编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入:strs = [“flower”,“flow”,“flight”]
输出:“fl”
示例 2:
输入:strs = [“dog”,“racecar”,“car”]
输出:“”
解释:输入不存在公共前缀。

代码

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
      if(strs.size()==0)
        return "";
      string re=strs[0];
      for(int i=1;i<strs.size();i++){
        re = compare(re,strs[i]);
        if(re=="")
          break;
      }
      return re;
    }

    string compare(string s1,string s2){
      int len=min(s1.length(),s2.length());
      int index=0;
      while(index<len && s1[index]==s2[index]){
        index++;
      }
      return s1.substr(0,index);
        
    }
};

5、有效的括号

题目

给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
示例 4:
输入:s = “([)]”
输出:false
示例 5:
输入:s = “{[]}”
输出:true

代码

class Solution {
public:
    bool isValid(string s) {
      int n = s.size();
      stack<char> myst;
      if(n%2==1)
        return false;
      for(int i=0;i<n;i++){
        if(s[i]=='(' || s[i]=='[' || s[i]=='{')
          myst.push(s[i]);
        else if(s[i]==')'&& !myst.empty()){
          if(myst.top()=='(')
            myst.pop();
          else
            myst.push(s[i]);
        }
        else if(s[i]==']' && !myst.empty()){
          if(myst.top()=='[')
            myst.pop();
          else
            myst.push(s[i]);
        }
        else if(s[i]=='}' && !myst.empty()){
          if(myst.top()=='{')
            myst.pop();
          else 
            myst.push(s[i]);
        }
        else
          return false;
      }
      if(myst.empty())
        return true;
      else
        return false;
    }
};

6、无重复字符的最长子串

题目

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

代码

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        unordered_set<char> occ;
        int n = s.size();
        int rr=0,ans=0;
        for(int i = 0;i<n;i++){
            if(i !=0 ){
                occ.erase(s[i-1]);
            }
            while(rr < n && !occ.count(s[rr])){
                occ.insert(s[rr]);
                rr++;
            }
            ans=max(ans,rr-i);
        }
        return ans;
    }
};

笔记

set.count():判断元素是否存在于set集合中,若存在则输出为1,若不存在输出为0
set.rease(i):移除集合中序号为 i 的元素,rease(first,last):移除[first,last)的元素
set.insert():往集合中插入元素
set.find():寻找集合中的某个元素,返回其序列

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值