每日训练(五)

简介: 每日训练五,题目来源:牛客、力扣

目录

 

1.把字符串转换成整数

2.字符串相加

3.反转字符串中的单词

4.字符串相乘


1.把字符串转换成整数

题目描述:

将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为 0 或者字符串不是一个合法的数值则返回 0

数据范围:字符串长度满足 0 \le n \le 100 \0≤n≤100

注意:

①字符串中可能出现任意符号,出现除 +/- 以外符号时直接输出 0

②字符串中可能出现 +/- 且仅可能出现在字符串首位。

输入描述:

输入一个字符串,包括数字字母符号,可以为空

返回值描述:

如果是合法的数值表达则返回该数字,否则返回0

输入:  "+2147483647"                        

返回值:2147483647

输入:"1a33"

返回值:0

解题思路:遍历字符串,判断当前字符是否符合(0,9)这个条件,如果是,那么将这个字符减去'0’,转换成整数,通过相加的结果*10再加上它,最终得出结果。

class Solution {
public:
    int StrToInt(string str) {
        string ans;
        int begin = 0;
        int end = str.size();
        long long result = 0;
        int sign = 1;
        while(begin < end)
        {
            if(str[begin]>='0' && str[begin]<='9')
            {
                result = result*10+(str[begin]-'0');
            }
            else if(str[begin]=='+')
            {
            }
            else if(str[begin]=='-')
            {
                sign = -1;
            }
            else if(str[begin]==' ')
            {
                continue;
            }
            else return 0;
            begin++;
        }
        return result*sign;
    }
};

image.gif

2.字符串相加

题目描述:

给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。

你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。

示例 1:

输入:num1 = "11", num2 = "123"

输出:"134"

示例 2:

输入:num1 = "456", num2 = "77"

输出:"533"

示例 3:

输入:num1 = "0", num2 = "0"

输出:"0"

解题思路:先从字符串尾开始遍历,逐个取字,然后两字相加,同时加上进位数。如果相加的结果超过9,也就是两位数以上,那么就需要进行进位——>取模,然后将结果转化为字符,插入到新的字符串中(尾插,最后会进行字符串翻转)。循环下去,直到两个字符串遍历结束。

再翻转字符串前,需要判断,存进位数的变量是否为为1,如果为1,那就证明还有一个数没有存进去,也就是最大的那个数,所有,需要额外加进去。

最后翻转字符串。

class Solution {
public:
    string addStrings(string num1, string num2) {
        if(num1=="0")
        {
            return num2;
        }
        if(num2=="0")
        {
            return num1;
        }
        if(num1=="0" && num2=="0")
        {
            return "0";
        }
        int end1 = num1.size()-1,end2 = num2.size()-1;
        int carray = 0;
        string sum;
        while(end1>=0 || end2>=0)
        {
            int val1 = end1>=0?num1[end1]-'0':0;
            int val2 = end2>=0?num2[end2]-'0':0;
            int tmp = val1+val2+carray;
            carray = tmp/10;
            tmp%=10;
            char s = tmp+'0';
            sum.push_back(s);
            end1--;
            end2--;
        }
        if(carray==1)
        {
            char s = carray+'0';
            sum.push_back(s);
        }
       reverse(sum.begin(),sum.end());
        return sum;
    }
};

image.gif

3.反转字符串中的单词

题目描述:

给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。

示例 1:

输入:s = "Let's take LeetCode contest"

输出:"s'teL ekat edoCteeL tsetnoc"

示例 2:

输入: s = "God Ding"

输出:"doG gniD"

解题思路:通过指针指向字符串的位置,当遇到空格就进行反转空格前的那一个单词。要注意的是,字符串最后的那个单词需要独立去反转,因为最后的单词的后面没有空格,而是结束标志'\0'。

{AY@C}$0~H$O}8}M56(%)OJ.png

class Solution {
public:
    void reverseString(string& s,int sbegin,int send) {
    while(sbegin<send)
        {
            swap(s[sbegin],s[send]);
            sbegin++;
            send--;
        }
    }
    string reverseWords(string s) {
        int sbegin = 0,send = 0;
        int begin = 0,end = s.size()-1;
        while(begin<=end)
        {
            if(s[begin]==' ')
            {
                send = begin-1;
                reverseString(s,sbegin,send);
                sbegin = begin+1;
            }
            begin++;
        }
        send = begin-1;
        reverseString(s,sbegin,send);
        return s;
    }
};

image.gif

4.字符串相乘

题目:

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。

示例 1:

输入: num1 = "2", num2 = "3"

输出: "6"

示例 2:

输入: num1 = "123", num2 = "456"

输出: "56088"

解题思路:在相乘的时候,是通过双循环来操作,这也跟我们现实中,进行乘法运算的操作一样。在乘出第一个结果后,先不用取模和除取进位数,而是先将其放进一个整数数组里面,存放的顺序是从数组尾开始存放。

当两个字符串中的数字全部乘完,并且将结果存进整型数组后,对整型数组进行取模和除取进位数的操作。

从数组尾开始,对当前数字进行取进位数,将进位数与前一个元素进行相加,接着取模,取模的的结果覆盖当前元素。

然后是判断首元素是否为0,如果为0,需要进行去0,去0的同时,将数组里面的元素,放进字符数组中,最后进行整型转换为字符的操作即可。

需要注意的是,在对字符串的数字相乘的时候,是+=,不是=,因为还有可能是要加上后面相乘的结果。(代码是学习力扣官方给出的答案)

char * multiply(char * num1, char * num2){
    int len_num1 = strlen(num1),len_num2 = strlen(num2);
    int* arr = (int*)malloc(sizeof(int)*(len_num1+len_num2+3));
    char* str = (char*)malloc(sizeof(char)*(len_num1+len_num2+3));
    memset(str,0,sizeof(char)*(len_num1+len_num2+3));
    memset(arr,0,sizeof(int)*(len_num1+len_num2+3));
    if((len_num1==1 && num1[0]=='0') || (len_num2==1 && num2[0]=='0'))
    {
        str[0] = '0',str[1] = 0;
        return str;
    }   
    for(int i = len_num1-1;i>=0;i--)
    {
        int val1 = num1[i]-'0';
        for(int j = len_num2-1;j>=0;j--)
        {
            int val2 = num2[j]-'0';
            arr[i+j+1]+= val1*val2;
        }
    }
    for(int i = len_num1+len_num2-1;i>0;i--)
    {
        arr[i-1]+= arr[i]/10;
        arr[i]%=10;
    }
    int index = arr[0]==0?1:0;
    int length = 0;
    while(index<len_num1+len_num2)
    {
        str[length++] = arr[index++];
    }
    for(int i = 0;i<length;i++)
    {
        str[i]+='0'; 
    }
    return str;
}

image.gif

这道题过两天需要二刷一次。

相关文章
|
2月前
|
数据采集 测试技术 API
小白必看!电商 API 开发避坑指南:签名错误、权限申请全解决
本文总结电商API开发常见问题与解决方案,涵盖京东、淘宝、拼多多的签名规则、权限申请、频率限制等核心踩坑点,结合实战案例,助你高效避坑,提升开发效率90%。
|
2月前
|
JSON 监控 算法
淘宝 + 京东关键字搜索比价 API 接口详解
本项目整合淘宝和京东商品搜索与比价API,支持跨平台价格对比、商品匹配、价格走势分析等功能。提供消费者最优价格选择,辅助商家市场调研与定价策略,附完整Python实现及应用解析。
|
传感器 自动驾驶 算法
SLAM:SLAM(即时定位与地图构建)的简介、发展、案例应用之详细攻略
SLAM:SLAM(即时定位与地图构建)的简介、发展、案例应用之详细攻略
|
人工智能 JSON 前端开发
copy和strong的区别及使用不当引起的crash
copy和strong的区别及使用不当引起的crash
249 0
|
10月前
|
设计模式 存储 缓存
12.享元模式设计思想
享元模式是一种用于性能优化的设计模式,通过共享相同或相似对象来减少内存占用。本文档详细介绍了享元模式的基础概念、实现原理、应用场景及优缺点,并通过具体例子如Integer、String、线程池和Handler等展示了其实际应用。此外,还探讨了享元模式与其他设计模式的结合使用,以及在休闲棋类和文本编辑器中的应用。适合需要优化系统性能和资源利用率的开发者参考。
179 2
|
JSON 缓存 fastjson
一行日志引发的系统异常
本文记录了一行日志引发的系统异常以及作者解决问题的思路。
185 11
|
人工智能 自然语言处理 语音技术
通用大模型VS垂直大模型
【7月更文挑战第16天】通用大模型VS垂直大模型
|
Java
java通过idea启动查看类加载来源信息
java通过idea启动查看类加载来源信息
344 0
|
Java
Java中的循环结构详解
Java中的循环结构详解
268 1
|
SQL 存储 Java
Hive教程(06)- Hive SerDe序列化与反序列化
Hive教程(06)- Hive SerDe序列化与反序列化
501 0