题解 | #比较版本号#

比较版本号

https://www.nowcoder.com/practice/2b317e02f14247a49ffdbdba315459e7

#include <iostream>

class Solution {
 public:
  /**
   * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
   *
   * 方法一:该方法的时间复杂度为O(n), 没有使用二分查找法;
   要点:利用迭代器进行相互比较,抽象出接口,可以让代码更加简洁,而且不容易出错。
   * 比较版本号
   * @param version1 string字符串
   * @param version2 string字符串
   * @return int整型
   */
  int compare(string version1, string version2) {
    auto number1 = GetRevisionNumbers(version1);
    auto number2 = GetRevisionNumbers(version2);
	/*
	版本一:该比较累赘,容易出错;版本二,利用了vector的resize的用法;简洁不容易出错;
    auto n1 = number1.size();
    auto n2 = number2.size();
    if (n1 > n2) {
      for (auto i = 0; i < n1 - n2; ++i)
        number2.push_back(0);
    } else if (n1 < n2) {
      for (auto i = 0; i < n2 - n1; ++i) 
        number1.push_back(0);
    }
	*/
	// 版本二:
	auto number1 = GetRevisionNumbers(version1);
    auto number2 = GetRevisionNumbers(version2);
    auto max_count = std::max(number1.size(), number2.size());
    number1.resize(max_count);
    number2.resize(max_count);

    auto it1 = number1.cbegin(), it2 = number2.cbegin();
    while (it1 != number1.cend() && it2 != number2.cend()) {
      if (*it1 > *it2)
        return 1;
      else if (*it1 < *it2)
        return -1;
      else {
        ++it1;
        ++it2;
      }
    }

    return 0;
  }

  std::vector<int32_t> GetRevisionNumbers(string& version) {
    std::vector<int32_t> revisions;
    const char kDelimeter = '.';
    auto it = version.cbegin();
    int32_t num = 0;
    auto count = 0;
    bool first_is_zero = true;
    while (it != version.cend()) {
      if (*it != '.') {
        if (first_is_zero) {
          if (*it == '0') {
            ++it;
            continue;
          } else {
            first_is_zero = false;
          }
        }
        num += (*it - '0') * pow(10, count);
        ++count;
      } else {
        revisions.push_back(num);
        num = 0;
        count = 0;
        first_is_zero = true;
      }
      ++it;
    }
    revisions.push_back(num);
    return revisions;
  }
};

全部评论

相关推荐

求面试求offer啊啊啊啊:1600一个月?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务