目录
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; } };
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; } };
3.反转字符串中的单词
题目描述:
给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例 1:
输入:s = "Let's take LeetCode contest"
输出:"s'teL ekat edoCteeL tsetnoc"
示例 2:
输入: s = "God Ding"
输出:"doG gniD"
解题思路:通过指针指向字符串的位置,当遇到空格就进行反转空格前的那一个单词。要注意的是,字符串最后的那个单词需要独立去反转,因为最后的单词的后面没有空格,而是结束标志'\0'。
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; } };
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; }
这道题过两天需要二刷一次。