LeetCode题解及详细注释(持续更新(c/c++实现))

文章目录

    • 如有错误请指出,谢谢!
    • 一、字符串类型
    • 1、(LeetCode)415.字符串相加
    • 2、字符串反转
    • 3、(LeetCode)917.只反转字符
    • 4、(leetcode)387. 字符串中的第一个唯一字符
    • 5、(牛客)计算字符串最后一个单词的长度,单词以空格隔开

如有错误请指出,谢谢!

一、字符串类型

1、(LeetCode)415.字符串相加

题目

class Solution {
public:
    int addCarry(int num1, int num2, int &carry){
        int sum = num1 + num2 + carry;
        if(sum >= 10){
            sum -= 10;
            carry = 1;
        } else{
            carry = 0;
        }
        return sum;
    }
    string addStrings(string num1, string num2) {
        //首先将字符串反转顺序 有助于相加的进位
        reverse(num1.begin(),num1.end());
        reverse(num2.begin(),num2.end());
        //进行字符串的相加
        int i, j, carry = 0;//carry为进位符
        int sum = 0;
        string result;//保存结果
        while(i < num1.size() && j < num2.size()){
            sum = addCarry(num1[i]-'0',num2[j]-'0',carry);
            result += (sum+'0');
            i++;
            j++;
        }
        //如果两个字符串的长度不想等,首先字符串1长
        while(i<num1.size()){
            sum = addCarry(num1[i]-'0',0,carry);
            result += (sum+'0');
            i++;
        }
        //首先字符串2长
        while(j<num2.size()){
            sum = addCarry(0,num2[j]-'0',carry);
            result += (sum+'0');
            j++;
        }
        //如果最后carry是1 则有:
        if(carry > 0){
            result +=(carry+'0');
        }
        //反转字符串
         reverse(result.begin(),result.end());
         return result;
    }
};

2、字符串反转

class Solution {
public:
	//定义交换函数
    void swap(char& a,char& b){
        char temp = a;
        a = b;
        b = temp;
    }
    string reverseOnlyLetters(string S) {
        int len  = S.size();//求字符串的长度
        int left = 0;//字符串的左下标
        int right = len-1;//字符串的右下标
        while(left < right){
            swap(S[left],S[right]);
            left++;
            right--;
        }
        return S;
    }
};

3、(LeetCode)917.只反转字符

题目

class Solution {
public:
	//定义交换函数
    void swap(char& a,char& b){
        char temp = a;
        a = b;
        b = temp;
    }
    string reverseOnlyLetters(string S) {
        int len  = S.size();//求字符串的长度
        //如果字符串长度小于等于1 返回字符串
        if(len<=1){
            return S;
        }
        int left = 0;//字符串的左下标
        int right = len-1;//字符串的右下标
        //左小标 小于右小标 则判断是否需要反转
        while(left < right){
            //左小标 小于右小标 则判断是否需要反转
            while(left<right){
                //如果字符属于这个范围 则跳出 不属于这个范围则左字符++
                if((S[left] >= 'a'&& S[left] <='z' ) ||( S[left] >= 'A'&& S[left] <= 'Z' )){
                    break;
                }else{
                    left++;
                }
            }
            while(left<right){
            //如果字符属于这个范围 则跳出 不属于这个范围则右字符++
               if((S[right] >= 'a'&& S[right] <='z' )||(S[right] >= 'A'&& S[right] <= 'Z')){
                    break;
                }else{
                    right--;
                }
            }
            swap(S[left],S[right]);//交换位置
            //向两端逼近 
            left++;
            right--;
        }
        return S;
    }
};

4、(leetcode)387. 字符串中的第一个唯一字符

题目
方法1:

class Solution {
public:
    int firstUniqChar(string s) {
        int count[256]  = {0};//定义一个256个字节的空间(因为字符的空间最大是256)
        //将字符出现的值记录下来  没有重复的是1 重复的一次累加
        for(int i = 0;i<s.size();++i){
            count[s[i]]++;
        }
        //查找出现的次数 如果是第一次出现  那么count【】 ==1 返回小标i
        for(int i = 0;i<s.size();++i){
            if(count[s[i]] == 1){
                return i;
            }
        }
        return -1;
    }
};

方法2:从两头查找 如果下标相等则不重复 return

 for(int i = 0;i<s.size();++i){
            int index = s.find(s[i]);
            int reverseIndex = s.rfind(s[i]);
            if(index == reverseIndex){
                return i;
            }
        }
        return -1;

5、(牛客)计算字符串最后一个单词的长度,单词以空格隔开

题目:

#include
#include
using namespace std;

int GetStringLen(string str){
    if(str.size() == 0){
        return 0;
    }
    int spaceIndex = str.rfind(' ');//查找最后一个空格的位置
    //如果最后一个空格的位置 一直没有找到,直到字符串结束 则返回这个字符串的长度
    if(spaceIndex  == string::npos){
        return str.size();
    }
    //字符串的长调度减去最后一个空调的的位置 在减去1 则是最后一个单词的长度
    return str.size()- spaceIndex -1;
}

int main(){
    string str;
    getline(cin,str);
    int len = GetStringLen(str);
    cout<<len;
    return 0;
}

你可能感兴趣的:(Leetcode)