[解题报告]《算法零基础100讲》(第27讲) 字符串算法(七) - 高精度(2)

简介: [解题报告]《算法零基础100讲》(第27讲) 字符串算法(七) - 高精度


415. 字符串相加


415. 字符串相加

https://leetcode-cn.com/problems/add-strings/


题目描述


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


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


思路


按照知识点进行计算就好了,我比较喜欢直接while几次,我相信你们能看懂。


void swap(char *a,char *b){
    *a = *a ^ *b;
    *b = *a ^ *b;
    *a = *a ^ *b;
}
void rever(char *s){//反转字符串
    int len = strlen(s);
    for(int i = 0;i < len/2;i++)
        swap(&s[i],&s[len-1-i]);
}
char * addStrings(char * num1, char * num2){
    int size1 = strlen(num1),size2 = strlen(num2),jinwei = 0;
    char *ans = malloc(sizeof(char)*10020);
    int ansSize = 0;
    while(size1&&size2){    //两数相加
        size1--;size2--;
        ans[ansSize++] = (num1[size1] - '0' + num2[size2] -'0' + jinwei) % 10 + '0';
        jinwei = (num1[size1]-'0' + num2[size2]-'0' + jinwei) /10;
    }
    while(size1){   //一还长
        size1--;
        ans[ansSize++] = (num1[size1] - '0' + jinwei)%10 + '0';
        jinwei = (num1[size1] -'0'+ jinwei)/10;
    }
    while(size2){   //二还长
        size2--;
        ans[ansSize++] = (num2[size2] - '0' + jinwei)%10 +'0';
        //printf("%d ",ansSize);
        jinwei = (num2[size2] - '0'+ jinwei)/10;
    }
    while(jinwei){  //进位还有
        ans[ansSize++] = jinwei%10 + '0';
        jinwei/=10;
    }
    ans[ansSize] =0;
    rever(ans);
    return ans;
}

67. 二进制求和


67. 二进制求和

https://leetcode-cn.com/problems/add-binary/


题目描述


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


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


思路


按照知识点进行计算就好了,不同的就是进位的计算方式,直接看吧。


void swap(char *a,char *b){
    *a = *a ^ *b;
    *b = *a ^ *b;
    *a = *a ^ *b;
}
void rever(char *s){
    int len = strlen(s);
    for(int i = 0;i < len/2;i++)
        swap(&s[i],&s[len - 1 -i]);
}
char * addBinary(char * a, char * b){
    int jinwei = 0,anssize = 0,size1 = strlen(a),size2 = strlen(b) ;
    char *ans = malloc(sizeof(char)*10010);
    while(size1 && size2){
        size1--;size2--;
        ans[anssize++] = (jinwei +a[size1] - '0'+b[size2] - '0')%2 +'0';
        jinwei = (jinwei + a[size1]-'0' +b[size2]-'0')/2; 
    }
    while(size1){
        size1--;
        ans[anssize++] = (jinwei + a[size1]-'0')%2 +'0';
        jinwei = (jinwei +a[size1] - '0')/2;
    }
    while(size2){
        size2--;
        ans[anssize++] = (jinwei +b[size2]-'0')%2 +'0';
        jinwei = (jinwei +b[size2] -'0')/2;
    }
    while(jinwei){
        ans[anssize++] = jinwei%2 +'0';
        jinwei/=2;
    }
    ans[anssize] = 0;
    rever(ans);
    return ans;
}


1880. 检查某单词是否等于两单词之和


1880. 检查某单词是否等于两单词之和

https://leetcode-cn.com/problems/check-if-word-equals-summation-of-two-words/


题目描述


给你三个字符串 firstWord、secondWord 和 targetWord ,每个字符串都由从 'a' 到 'j' (含 'a' 和 'j' )的小写英文字母组成。


如果 firstWord 和 secondWord 的 数值之和 等于 targetWord 的数值,返回 true ;否则,返回 false 。


思路


这个题给的范围是8个,那一个int不就存的下了?那直接转成int加看等不等不就完了?


int tonum(char *s){     //转换为数字方便计算
    int ans = 0;
    for(int i = 0;s[i];i++){
        ans*=10;
        ans += s[i] - 'a';
    }
    return ans;
}
bool isSumEqual(char * firstWord, char * secondWord, char * targetWord){
    return tonum(targetWord) == tonum(firstWord) +tonum(secondWord);
}

43. 字符串相乘


43. 字符串相乘

https://leetcode-cn.com/problems/multiply-strings/


题目描述


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


思路


按照知识点进行计算就好了。


void swap(char *a,char *b){
    *a = *a ^ *b;
    *b = *a ^ *b;
    *a = *a ^ *b;
}
int verse(char *s){        //逆序
    int len = strlen(s);
    for(int i = 0;i<len/2;i++)  swap(&s[i],&s[len - 1 - i]);
    return len;
}
char * multiply(char * num1, char * num2){
    int size1 = verse(num1),size2 = verse(num2);//反转字符串 顺带提取长度
    int *ans = malloc(sizeof(int)*(size1 + size2 + 1));
    memset(ans,0,sizeof(int)*(size1+size2+1));
    char *anschar = malloc(sizeof(char)*(size1 + size2 +5));
    for(int i = 0;i < size1;i++)
        for(int j = 0;j < size2;j++)
            ans[i+j] += (num1[i] - '0' )*( num2[j] - '0');
    int jinwei = 0,anssize = size1+size2-1;
    for(int i = 0;i < size1 +size2 - 1;i++){//处理进位
        printf("%d %d",ans[i],jinwei);
        anschar[i] = (jinwei+ans[i])%10 + '0';
        jinwei = (jinwei+ans[i])/10;
    }
    while(jinwei){
        anschar[anssize++] = jinwei%10 +'0';
        jinwei/=10; 
    }
    while(anssize > 1&&anschar[anssize-1] == '0') anssize--;    //处理头部0
    anschar[anssize++] = 0;
    anssize=verse(anschar);
    return anschar;
}


273. 整数转换英文表示


273. 整数转换英文表示

https://leetcode-cn.com/problems/integer-to-english-words/


题目描述


将非负整数 num 转换为其对应的英文表示。


思路


(终于到这题了,哈哈哈),我知识点里只说了一句分治。那这题怎么分治呢?


英语的逗号为啥是三位一个呢?因为他们算是三位是一组。然后读完一组加个单位就好了。跟我们喜欢四位一组一样呀。所以我们就按照这个规律来嘛。


先处理掉三位以内咋读,然后连一起就完事了?


char single[10][10] = {"Zero","One","Two","Three","Four","Five","Six","Seven","Eight","Nine"};
char teens[10][10] = {"Ten","Eleven","Twelve","Thirteen","Fourteen","Fifteen","Sixteen","Seventeen","Eighteen","Nineteen"};
char ty[10][10] = {" ","Ten","Twenty","Thirty","Forty","Fifty","Sixty","Seventy","Eighty","Ninety"};
char hundered[4][10] ={"Hundred","Thousand","Million","Billion"};
char *qian(int);//声明有一个函数
char * numberToWords(int num){
    char *ans =malloc(sizeof(char)*200); //每位数字最多两个单词 一个单词5位左右,最多九位估计90个
    ans[0]= 0;
    if(!num){
        strcat(ans,single[0]);//返回0
        return ans;
    }
    for(int i = 3,wei = 1000000000;i>=0;i--,wei/=1000){
            int temp = num/wei;
            if(temp){
                strcat(ans,qian(temp));
                if(i){
                    strcat(ans,ty[0]);//插入空格
                    strcat(ans,hundered[i]);//插入位信息
                    if(num %= wei)  strcat(ans,ty[0]);//插入空格
                }
            }
            num %= wei;
    }
    return ans;
}
char *qian(int num){        //处理三位数
    char *ans = malloc(sizeof(char)*100);//4位最多也就40个吧
    ans[0] = 0;
    if(num/100){
        strcat(ans,single[num/100]);
        strcat(ans,ty[0]);//空格
        strcat(ans,hundered[0]);//百
        num %= 100;
        if(num) strcat(ans,ty[0]);//空格
    }
    if(num/10 > 1){ //teens
        strcat(ans,ty[num/10]);//插入十位
        num %= 10;
        if(num) strcat(ans,ty[0]);
    }
    if(num >=10){
        strcat(ans,teens[num-10]);
        return ans;
    }
    else if(num > 0){
        strcat(ans,single[num]);
        return ans;
    }
    return ans;
}

写在最后


今天题量有点大,有点吃不消了是不存在的。。。哈哈哈哈哈哈  爽  大家加油呀。

相关文章
|
3月前
|
算法
【算法】滑动窗口——找到字符串中所有字母异位词
【算法】滑动窗口——找到字符串中所有字母异位词
|
1月前
|
算法
两个字符串匹配出最长公共子序列算法
本文介绍了最长公共子序列(LCS)问题的算法实现,通过动态规划方法求解两个字符串的最长公共子序列,并提供了具体的编程实现细节和示例。
74 1
两个字符串匹配出最长公共子序列算法
|
1月前
|
算法 Java 程序员
【算法每日一练及解题思路】有n级台阶,一次只能上1级或2级,共有多少种走法?
本文深入解析了“爬楼梯问题”,探讨了递归与迭代两种解法,并提供了Java代码实现。通过分析问题本质,帮助读者理解动态规划技巧,提高解决实际编程问题的能力。关键词:Java, 算法, 动态规划, 爬楼梯问题, 递归, 迭代。
65 0
|
1月前
|
算法 C++
【算法解题思想】动态规划+深度优先搜索(C/C++)
【算法解题思想】动态规划+深度优先搜索(C/C++)
|
3月前
|
算法 Java
掌握算法学习之字符串经典用法
文章总结了字符串在算法领域的经典用法,特别是通过双指针法来实现字符串的反转操作,并提供了LeetCode上相关题目的Java代码实现,强调了掌握这些技巧对于提升算法思维的重要性。
|
4月前
|
自然语言处理 算法 搜索推荐
字符串相似度算法完全指南:编辑、令牌与序列三类算法的全面解析与深入分析
在自然语言处理领域,人们经常需要比较字符串,这些字符串可能是单词、句子、段落甚至是整个文档。如何快速判断两个单词或句子是否相似,或者相似度是好还是差。这类似于我们使用手机打错一个词,但手机会建议正确的词来修正它,那么这种如何判断字符串相似度呢?本文将详细介绍这个问题。
272 1
|
4月前
|
数据采集 算法 JavaScript
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
JavaScript字符串搜索涵盖`indexOf`、`includes`及KMP算法。`indexOf`返回子字符串位置,`includes`检查是否包含子字符串。KMP是高效的搜索算法,尤其适合长模式匹配。示例展示了如何在数据采集(如网页爬虫)中使用这些方法,结合代理IP进行安全搜索。代码示例中,搜索百度新闻结果并检测是否含有特定字符串。学习这些技术能提升编程效率和性能。
117 1
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
|
3月前
|
算法 C++
惊爆!KPM算法背后的秘密武器:一行代码揭秘字符串最小周期的终极奥义,让你秒变编程界周期大师!
【8月更文挑战第4天】字符串最小周期问题旨在找出字符串中最短重复子串的长度。KPM(实为KMP,Knuth-Morris-Pratt)算法,虽主要用于字符串匹配,但其生成的前缀函数(next数组)也可用于求解最小周期。核心思想是构建LPS数组,记录模式串中每个位置的最长相等前后缀长度。对于长度为n的字符串S,其最小周期T可通过公式ans = n - LPS[n-1]求得。通过分析周期字符串的特性,可证明该方法的有效性。提供的C++示例代码展示了如何计算给定字符串的最小周期,体现了KPM算法在解决此类问题上的高效性。
81 0
|
4月前
|
机器学习/深度学习 人工智能 文字识别
一种基于YOLOv8改进的高精度红外小目标检测算法 (原创自研)
【7月更文挑战第2天】 💡💡💡创新点: 1)SPD-Conv特别是在处理低分辨率图像和小物体等更困难的任务时优势明显; 2)引入Wasserstein Distance Loss提升小目标检测能力; 3)YOLOv8中的Conv用cvpr2024中的DynamicConv代替;
433 4
|
4月前
|
算法 Java
KMP算法详解及其在字符串匹配中的应用
KMP算法详解及其在字符串匹配中的应用