码迷,mamicode.com
首页 > 其他好文 > 详细

2016.5.21——Compare Version Numbers

时间:2016-05-22 00:28:32      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:

Compare Version Numbers

本题收获:

1.

2.

  题目:

  Compare two version numbers version1 and version2.
  If version1 > version2 return 1, if version1 < version2 return -1, otherwise return 0.

  You may assume that the version strings are non-empty and contain only digits and the . character.
  The . character does not represent a decimal point and is used to separate number sequences.
  For instance, 2.5 is not "two and a half" or "half way to version three", it is the fifth second-level revision of the second first-level revision.

  Here is an example of version numbers ordering:

  0.1 < 1.1 < 1.2 < 13.37

  思路:

  我的思路:将字符串转化为数字比较大小(字符串如何转化为数字不知道怎么操作)

  leetcode/dicuss思路:将字符串转化为数字比较大小,有两种代码实现方式。

  代码:

  代码1:思路很易懂

 1 int compareVersion(string version1, string version2) {
 2     int i = 0; 
 3     int j = 0;
 4     int n1 = version1.size(); 
 5     int n2 = version2.size();
 6 
 7     int num1 = 0;
 8     int num2 = 0;
 9     while(i<n1 || j<n2)        //如果有有一个先结束,就结束循环
10     {
11         while(i<n1 && version1[i]!=.){        //遇到‘.‘结束循环
12             num1 = num1*10+(version1[i]-0);
13             i++;
14         }
15 
16         while(j<n2 && version2[j]!=.){
17             num2 = num2*10+(version2[j]-0);;
18             j++;
19         }
20 
21         if(num1>num2) return 1;
22         else if(num1 < num2) return -1;
23 
24         num1 = 0;            //遇到‘.‘后结束循环,将num置0,重新开始循环,先比较‘.‘之前,在比较‘.‘之后
25         num2 = 0;
26         i++;
27         j++;
28     }
29 
30     return 0;
31 }

  结合代码看思路:先比较‘.‘之前的,如果不相等则返回,如果相同继续以同样的方法判断‘.‘之后的。

  代码2:涉及到的较多的库函数,但是很简洁。

 1 class Solution {
 2 public:
 3     int compareVersion(string version1, string version2) {
 4         for (; version1 != version2; version1 = nextSubstr(version1),version2 = nextSubstr(version2)) {    //nextSubstr()是自己定义的函数,在下面
 5             int gap = stoi(version1) - stoi(version2);     //stoi()是库函数,将字符串转化为数字   
 6             if (gap != 0) {
 7                 return gap > 0 ? 1 : -1;
 8             }
 9         }
10         return 0;
11     }
12 
13     string nextSubstr(string str) {
14         for (int i = 0; i < str.size(); i++) {
15             if (str.at(i) == .) {        //str.at(i) 等价于str[i]
16                 return str.substr(i + 1);    //substr()是字符函数,返回从i+1到字符串尾这段,即遇到‘.‘则    
17             }
18         }
19         return "0";    //为什么返回的是字符串0????
20     }
21 };

  几个相关知识:

    1.str.at() : at是STL中的,str.at()等价于str[i],作用相同。

    2.substr() : substr(start, len)/获得字符串s中 从第‘start‘位开始的长度为‘len‘的字符串 //默认时的长度为从开始位置到尾 

          substr(x)则是从x位开始到尾部

          http://blog.csdn.net/no_retreats/article/details/7853066

    3.stoi() : 将字符串转化为整型

  代码2的调试过程:不太明白是怎么处理的所以记录调试过程

 1 class MyClass {
 2 public:
 3     int compareVersion(string version1, string version2) {
 4         for (version1, version2; version1 != version2; version1 = nextSubstr(version1), version2 = nextSubstr(version2)) {
 5             cout << nextSubstr(version1) << endl;    //23   234
 6             cout << nextSubstr(version2) << endl;    //56  678
 7             int gap = stoi(version1) - stoi(version2);
 8             cout << stoi(version1) << endl;
 9             cout << stoi(version2) << endl;
10             if (gap != 0) {
11                 return gap > 0 ? 1 : -1;
12             }
13         }
14         return 0;
15     }
16 
17     string nextSubstr(string str) {
18         for (size_t i = 0; i < str.size(); i++) {
19             if (str.at(i) == .) {
20                 return str.substr(i + 1);
21                 //cout << i + 1 << endl;    //为什么在这里无法输出任何内容
22             }        
23             //cout << i+1 << endl;
24         }
25         //cout << str.substr() << endl;
26         return "0";
27     }
28 };

  输入:1.23 3.45                输入:1.234  5.678       

  技术分享        技术分享

  由此可以看出for循环  第一次循环‘.‘之前的内容,进行判断

            第二次循环‘.‘之后的内容。进行判断

  nextSubstr() 只对小数点之后的进行操作。

  疑问??为什么在第26行返回的是"0",而不是数字0,应为条用时是version 而version为string,所以返回值必须为string,但是改为0,运行没有出错。

  自己的测试代码:带有main函数,测试通过

  

2016.5.21——Compare Version Numbers

标签:

原文地址:http://www.cnblogs.com/zhuzhu2016/p/5515901.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!