算法

  • Post author:
  • Post category:其他




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()

:寻找集合中的某个元素,返回其序列



版权声明:本文为Smiling_lzy原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。