string的OJ练习

这篇博客探讨了三种基本的字符串操作:1) 找到字符串中首次出现一次的字符;2) 反转字符串内的单词;3) 实现字符串的乘法运算。代码示例展示了C++实现这些操作的方法,包括使用计数数组来查找唯一字符,通过遍历和交换实现单词反转,以及通过位运算和累加完成字符串相乘。
摘要由CSDN通过智能技术生成

1. 找出字符串中第一个出现一次的字符


>代码展示:

#include<iostream>
using namespace std;

int main()
{
    string s;
    while(cin >>s)
    {
        int count[26]={0};//定义一个计数数组
        for(auto& i:s)//遍历字符串将出现的数字次数记录在数组相应的位置上
        {
            count[i-'a']++;
        }
        for(int i=0;i<s.size();++i)//拿到字符串中的字母在数组中相应的位置看其是否为1
        {
            if(count[s[i]-'a']==1)
            {
                cout<<s[i]<<endl;
                break;
            }
            if(i==s.size()-1)
                cout<<-1<<endl;
        }
    }
    return 0;
    
}

2.反转字符串中的单词

在这里插入图片描述

先来分析一下题目意思就是给一个字符串中间的单词用空格隔开,我们要对里面的每个单词分别反转。
>代码展示:

class Solution {
public:
    string reverseWords(string s) {
        int start=0;
        size_t pos=0;
        while(start<s.size())
        {
             pos=s.find(' ',start);//找到空格位置
             if(pos>s.size())
             {
                 pos=s.size();
             }
            int i=start,j=pos-1;
            while(i<j)//将每个单词逆置
            {
                swap(s[i],s[j]);
                ++i;
                --j;
            }
           start=pos+1;
        }
         return s;
    }
   
};

3.字符串相乘

在这里插入图片描述

分析:
在这里插入图片描述
代码展示:

class Solution {
public:
    string multiply(string num1, string num2) {
        int end1=num1.size()-1,end2=num2.size()-1;
        //相乘的结果位数不能超过两个数的位数和
        vector<int> res(end1+end2+2,0);

        for(int i=end1;i>=0;--i)
        {
            for(int j=end2;j>=0;--j)
            {
                int mul=(num1[i]-'0')*(num2[j]-'0');

                //乘积在res中的对应位置
                int p1=i+j,p2=i+j+1;
                int sum=mul+res[p2];
                res[p2]=sum%10;
                res[p1]+=sum/10;
            }
        }
        //如果有前置零则往后走
        int i=0;
        while(i<res.size()&&res[i]==0)
            ++i;
        //拆解在字符串中
        string str;
        for(;i<res.size();++i)
        {
            str+=('0'+res[i]);
        }
        return str.size()==0?"0":str;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值