如果你想在校招中顺利拿到更好的offer,阿秀建议你多看看前人的经验 ,比如准备简历实习上岸经历校招总结阿里、字节、腾讯、美团等一二线大厂真实面经也欢迎来一起参加秋招打卡活动 等;如果你是计算机小白,学习/转行/校招路上感到迷茫或者需要帮助,可以点此联系阿秀;免费分享阿秀个人学习计算机以来的收集到的好资源,点此白嫖;如果你需要《阿秀的学习笔记》网站中求职相关知识点的PDF版本的话,可以点此下载

# 165. 比较版本号 挺好的一道题

力扣原题链接(点我直达) (opens new window)

比较两个版本号 version1version2。 如果 *version1* > *version2* 返回 1,如果 *version1* < *version2* 返回 -1, 除此之外返回 0

你可以假设版本字符串非空,并且只包含数字和 . 字符。

. 字符不代表小数点,而是用于分隔数字序列。

例如,2.5 不是“两个半”,也不是“差一半到三”,而是第二版中的第五个小版本。

你可以假设版本号的每一级的默认修订版号为 0。例如,版本号 3.4 的第一级(大版本)和第二级(小版本)修订号分别为 34。其第三级和第四级修订号均为 0

示例 1:

输入: version1 = "0.1", version2 = "1.1"
输出: -1
1
2

示例 2:

输入: version1 = "1.0.1", version2 = "1"
输出: 1
1
2

示例 3:

输入: version1 = "7.5.2.4", version2 = "7.5.3"
输出: -1
1
2

示例 4:

输入:version1 = "1.01", version2 = "1.001"
输出:0
解释:忽略前导零,“01” 和 “001” 表示相同的数字 “1”。
1
2
3

示例 5:

输入:version1 = "1.0", version2 = "1.0.0"
输出:0
解释:version1 没有第三级修订号,这意味着它的第三级修订号默认为 “0”。
1
2
3

提示:

  1. 版本字符串由以点 (.) 分隔的数字字符串组成。这个数字字符串可能有前导零。
  2. 版本字符串不以点开始或结束,并且其中不会有两个连续的点。

# 1、双指针,不过int会溢出

"19.8.3.17.5.01.0.0.4.0.0.0.0.0.0.0.0.0.0.0.0.0.00.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.000000.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.000000"
"19.8.3.17.5.01.0.0.4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0000.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.000000"
1
2
int compareVersion(string version1, string version2) {

        int sum1 = 0, sum2 = 0;
        int len1 = version1.size(),len2 = version2.size();
        int index1 = 0,index2 = 0;

        while(index1 < len1 || index2 < len2){
            int temp = 0;
            while(index1 < len1  && version1[index1] != '.'){
                //if(version1[index1] ==0 && temp == 0) index1++;
                //if(version1[index1] ==0 && temp != 0) temp = temp*10;

                if(version1[index1] == 0) temp = temp*10;

               // if(version1[index1] !=0 && temp != 0) temp = temp*10 + version1[index1]-'0';
                //if(version1[index1] !=0 && temp == 0) temp = version1[index1] - '0';
                if(version1[index1] !=0) temp = temp*10 + version1[index1]-'0';

                index1++;

            }
            sum1 = sum1*10 +temp;

            temp = 0;
            while(index2 < len2  && version2[index2] != '.'){
                //if(version1[index1] ==0 && temp == 0) index1++;
                //if(version1[index1] ==0 && temp != 0) temp = temp*10;

                if(version2[index2] == 0) temp = temp*10;

               // if(version1[index1] !=0 && temp != 0) temp = temp*10 + version1[index1]-'0';
                //if(version1[index1] !=0 && temp == 0) temp = version1[index1] - '0';
                if(version2[index2] !=0) temp = temp*10 + version2[index2]-'0';

                index2++;
            }
            sum2 = sum2*10 +temp;
            //cout<<sum1<<" "<<sum2<<endl;
            index1++;
            index2++;
            if(sum1 > sum2) return 1;
            if(sum1 < sum2) return -1;

        }
        return 0;
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

# 2、改进一下,其实每次比较完毕,如果一样就可以置0,再继续比较下去了

执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户

内存消耗:6.2 MB, 在所有 C++ 提交中击败了100.00%的用户

int compareVersion(string version1, string version2) {

	int sum1 = 0, sum2 = 0;
	int len1 = version1.size(), len2 = version2.size();
	int index1 = 0, index2 = 0;

	while (index1 < len1 || index2 < len2) {
		int temp = 0;
		while (index1 < len1 && version1[index1] != '.') {
			//if(version1[index1] ==0 && temp == 0) index1++;
			//if(version1[index1] ==0 && temp != 0) temp = temp*10;

			if (version1[index1] == 0) temp = temp * 10;

			// if(version1[index1] !=0 && temp != 0) temp = temp*10 + version1[index1]-'0';
			 //if(version1[index1] !=0 && temp == 0) temp = version1[index1] - '0';
			if (version1[index1] != 0) temp = temp * 10 + version1[index1] - '0';

			index1++;

		}
		sum1 = sum1 * 10 + temp;

		temp = 0;
		while (index2 < len2 && version2[index2] != '.') {
			//if(version1[index1] ==0 && temp == 0) index1++;
			//if(version1[index1] ==0 && temp != 0) temp = temp*10;

			if (version2[index2] == 0) temp = temp * 10;

			// if(version1[index1] !=0 && temp != 0) temp = temp*10 + version1[index1]-'0';
			 //if(version1[index1] !=0 && temp == 0) temp = version1[index1] - '0';
			if (version2[index2] != 0) temp = temp * 10 + version2[index2] - '0';

			index2++;
		}
		sum2 = sum2 * 10 + temp;
		cout<<sum1<<" "<<sum2<<endl;
		index1++;
		index2++;
		if (sum1 > sum2) return 1;
		if (sum1 < sum2) return -1;

		sum1 = 0;//这是关键
		sum2 = 0;

	}
	return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

# 3、精简代码

执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户

内存消耗:6.3 MB, 在所有 C++ 提交中击败了100.00%的用户

int compareVersion(string version1, string version2) {

	int sum1 = 0, sum2 = 0;
	int len1 = version1.size(), len2 = version2.size();
	int index1 = 0, index2 = 0;

	while (index1 < len1 || index2 < len2) {
		sum1 = 0;
		sum2 = 0;

		while (index1 < len1 && version1[index1] != '.') {
			sum1 = sum1 * 10 + version1[index1] - '0';
			index1++;

		}

		while (index2 < len2 && version2[index2] != '.') {
            sum2 = sum2 * 10 + version2[index2] - '0';
			index2++;
		}

		index1++;
		index2++;
		//cout << sum1 << " " << sum2 << endl;
		if (sum1 > sum2) return 1;
		if (sum1 < sum2) return -1;

	}
	return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30