每日训练(五)

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

目录

 

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

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

相关文章
|
8天前
|
机器学习/深度学习 弹性计算 TensorFlow
在阿里云上打造强大的模型训练服务
随着人工智能技术的迅猛发展,模型训练服务变得愈发关键。阿里云提供了一系列强大的产品,使得在云端轻松搭建、优化和管理模型训练变得更加便捷。本文将详细介绍如何使用阿里云的相关产品构建高效的模型训练服务。
222 0
|
8天前
|
机器学习/深度学习 人工智能 边缘计算
为何人们喜欢推理胜于训练大模型?
在AI和机器学习领域,越来越多的人转向重视推理而非大规模模型训练。推理的即时性和高效性使其在需要快速响应的场景中占优,如自然语言处理和图像识别。推理过程的可视化能帮助用户理解模型决策,便于调试和提升性能。此外,推理在边缘计算和移动设备上的应用降低了延迟和带宽成本,同时保护了用户隐私。相比于训练大模型的高资源消耗,推理更为节能且成本效益高,尤其在数据挖掘和新知识探索方面展现出创新潜力。推理在实际应用中与训练模型相结合,提供了性能与成本的有效平衡。随着技术进步,推理将在推动人工智能领域发展中发挥更大作用。
|
9月前
|
XML 数据挖掘 数据格式
|
8天前
|
机器学习/深度学习 算法 Serverless
YoLo_V4模型训练过程
YoLo_V4模型训练过程
27 0
|
10月前
|
网络安全 开发工具 网络架构
YOLOV7详细解读(四)训练自己的数据集
YOLOV7详细解读(四)训练自己的数据集
604 0
|
11月前
|
机器学习/深度学习 数据处理
训练多个epoch来提高训练模型的准确率
训练多个epoch来提高训练模型的准确率
130 0
每日训练(一)
题目来源于PTA基础编程和力扣剑指offer
每日训练(一)