string OJ题

下面分享一下string做题心得

        1. 明白字符串中存储的数字为'0' '8'  '9'与0 8 9 完全不同,字符'0'其实在串中存储的是48,要有意识的转化。字符串中如果存数字8,意味着存了BS(退格)

        例如1: 算出结果为5,存入使用s+=(5+'0')

        例如2:读取数据 int num1 = s[i]-'0'

        2. 要熟练运用 s+=  或者 reserve(s1.begin() ,s1.end())或者是s1 = s2与s1.assign(s2)作用相同。

        3. 遇到不熟悉的接口一定要去查一查。

        下面为ascii表

        后面分享了3道oj题

43. 字符串相乘

检验是否是回文串

字符串转整形字符

检验是否是回文串第一题答案

class Solution {
public:
    string addStrings(string num1, string num2) 
    {
        int carry=0;
        string s3;
        int end1=num1.size()-1;
        int end2=num2.size()-1;

        while(end1>=0 ||end2>=0)
        {
            int x1 = end1 >= 0 ? num1[end1--]-'0' : 0;
            int x2 = end2 >= 0 ? num2[end2--]-'0' : 0;

            int end=x1+x2+carry;
            carry=end/10;
            end=end%10;

            s3+=(end+'0');
        }
        if(carry==1)
        {
            s3+='1';
        }
        reverse(s3.begin(),s3.end());
        return s3;
    }

	string multiply(string num1, string num2)
	{
        string return_string("0");
        if(num1.size()==1&&num1[0]=='0'
        ||num2.size()==1&&num2[0]=='0')
        return return_string;

		int end1 = num1.size() - 1;
		int end2 = num2.size() - 1;
		int carry = 0;
		int count[num2.size()+2];
		int num = 0;

		for (int i = 1; i <= num2.size(); ++i)
		{
			string s;
            int t=i;
            while(t>1)
            {
                s+='0';
                --t;
            }
			int numend1 = end1;
			while (numend1 >= 0)
			{
				int x1 = num1[numend1--] - '0';
				int x2 = num2[end2] - '0';
				int end = x1 * x2 + carry;
				carry = end / 10;
				end = end % 10;
				s += (end+'0');
			}
			if (carry > 0)
			{
				s += (carry+'0');
                carry=0;
			}
            end2--;
			reverse(s.begin(), s.end());
            string s3= addStrings(s,return_string);
            return_string.assign(s3);
		}
		return  return_string;

	}
};

第二题答案

class Solution {
public:
    bool ischar(char x)
    {
        if(x>='0'&&x<='9'
        ||x>='A'&&x<='Z'
        ||x>='a'&&x<='z')
        {
            return true;
        }
        return false;
    }
    bool isPalindrome(string s) 
    {
        for(auto& e:s)
        {
            if(e>='A'&&e<='Z')
            {
                e+=32;
            }
        }
        int begin=0;
        int end=s.size()-1;
        while(begin<end)
        {
            while(begin<end && !ischar(s[begin]))
            {++begin;}


            while(begin<end && !ischar(s[end]))
            {--end;}

            if(s[begin]!= s[end])
            {
                return false;
            }
            else
            {
                ++begin;
                --end;
            }
        }

        return true;
    }
};

第三题答案

class Solution {
public:
    int myAtoi(string str) 
     {
        bool sign = true;   //默认为正数

      // 跳过开头可能存在的空格
      int i = 0;
      while(i < str.size() && str[i] == ' ') 
      {
          i++;
      }

      //接着判断首个字符是否为正负号
      if(str[i] == '-') 
      {
          sign = false;  // 该字符串为负数,移至下一个字符接着判断
          i++;          
      }
      else if(str[i] == '+')  // 字符串为正数,sign已经默认为true,直接移动到下一位即可
          i++;   

      //下面开始对非正负符号位进行判断
      if(str[i] < '0' || str[i] > '9') // 正常数字第一位不能是0,必须为1~9之间的数字,否则就是非法数字
          return 0;  

      int res = 0;   //这里res用的int型,需要更加仔细考虑边界情况,但如果用long的话可以省去一些麻烦
      int num = 0; 
      int border = INT_MAX / 10;  // 用来验证计算结果是否溢出int范围的数据
      while(i < str.size())
      {
          // 遇到非数字字符,则返回已经计算的res结果
          if(str[i] < '0' || str[i] > '9') 
              break;

          // 注意这句话要放在字符转换前,因为需要验证的位数比实际值的位数要少一位, 这里比较巧妙的地方在于
          // 1. 用低于int型数据长度一位的数据border判断了超过int型数据长度的值 
          // 2. 将超过最大值和低于最小值的情况都包括了
          if(res > border || res == border && str[i] > '7')  
              return sign == true ? INT_MAX : INT_MIN;

          //开始对数字字符进行转换
          num = str[i] - '0';
          res = res * 10 + num;
          i++;
      }
        
      //最后结果根据符号添加正负号
      return sign == true ? res : -res;
  }
};

看到这里啦,你应该已经有了不少收获了

这个博客如果对你有帮助,给博主一个免费的点赞就是最大的帮助

欢迎各位点赞,收藏和关注哦

如果有疑问或有不同见解,欢迎在评论区留言哦

后续我会一直分享双一流211西北大学软件(C,数据结构,C++,Linux,MySQL)的学习干货以及重要代码的分享

评论 70
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一码归—码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值