free website counter

string与int转换相关

  在做Leetcode的Compare Version Numbers;涉及到string子串的比较,而子串全为数字,当时直接拿string来比较,没考虑到两个子串长度不同的情况,即”01”与”1”,应该是相等的。C语言中,使用atoi可以将string转换成int,而atoi的参数为const char *nptr,故在C++中,不能直接对string进行操作,可以先通过c_str返回一个指向正规C字符串的指针,再通过atoi进行转换;

1. 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;
}

2. string 转换成int

  • 首先通过s.cstr()将string转成char指针指向的数组;
  • 通过atoi()函数转成整数;
  • 需要注意的是,atoi(s.c_str())的方法转换,当s中存在非数字字符时,到非数字字符位置,转换会提前结束;ex: s = “a12”, return 0; s = “12a”, return 12;

3. Leetcode Compare Version Numbers

  比较两个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;
    }
};
Published 21 March 2015
分享按钮