在做Leetcode的Compare Version Numbers;涉及到string子串的比较,而子串全为数字,当时直接拿string来比较,没考虑到两个子串长度不同的情况,即”01”与”1”,应该是相等的。C语言中,使用atoi可以将string转换成int,而atoi的参数为const char *nptr
,故在C++中,不能直接对string进行操作,可以先通过c_str
返回一个指向正规C字符串的指针,再通过atoi
进行转换;
根据atoi()函数的功能,将字符串转换成整型数;atoi()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负号才开始做转换,而再遇到非数字或字符串时(’\0’)才结束转化,并将结果返回(返回转换后的整型数)。
int my_atoi(char* pstr)
{
int ret_int = 0;
int int_sign = 1;
//有指针,记得判断是否为空,防止越界;
if (pstr == NULL) {
printf("Pointer is NULL.\n");
return 0;
}
//跳过可能存在的空格;
while (isspace(*pstr) == 0)
pstr ++;
//检测符号,并跳过;
if (*pstr == '-')
int_sign = -1;
if (*pstr == '+' || *pstr == '-')
pstr ++;
//遍历数组,逐个转换成整数;
while (*pstr >= '0' && *pstr <= '9') {
ret_int += (10*ret_int + *pstr - '0');
pstr ++;
}
ret_int = int_sign * ret_int;
return ret_int;
}
比较两个version的大小,在151之后才添加的题目,SoulMachine的题解以及先前第一遍刷的时候都没见这个题目;version string中只包含数字和’.’,’.’隔开版本 号的层次;ex: 0.1 < 1.1 < 1.2 < 13.37 < 13.37.1
遍历一遍,每次纪录string中当前层的大小,进行对比,直接判断返回。若完全相同,则在最后返回相等;需要注意的是,通过改变最外层while循环的结束条件,可以控制将所有的逻辑判断,都放在循环体内;一开始将循环结束条件设置为一个string到达了末尾,如此,在该循环之外,还需要判断,到底是哪个string到达了末尾,代码很脏;
class Solution {
public:
int compareVersion(string version1, string version2) {
int v1_len = version1.size();
int v2_len = version2.size();
int idx1 = 0, idx2 = 0;
while (idx1 < v1_len || idx2 < v2_len) {
long long a = 0, b = 0;
while (idx1 < v1_len && version1[idx1] != '.')
a += (a * 10 + version1[idx1++] - '0');
++idx1;
while (idx2 < v2_len && version2[idx2] != '.')
b += (b * 10 + version2[idx2++] - '0');
++idx2;
if (a > b) return 1;
if (a < b) return -1;
}
return 0;
}
};