天天看點

Summary Ranges - LeetCode 228

題目描述:

Given a sorted integer array without duplicates, return the summary of its ranges.

For example, given [0,1,2,4,5,7], return ["0->2","4->5","7"].

Credits:

Special thanks to @jianchao.li.fighter for adding this problem and creating all test cases.

Tags Array

分析:本題是要将遞增序列中的連續片段标記出來,用雙指針來找範圍。另外還考查了将整數轉換為字元串,這需要注意整數的邊界條件和整數的符号。

/**///0ms/*/
class Solution {
public:
  string int2str(int num){ //将一個合法的非負數轉換為字元串
    string s;
    int a = num;
    if(a == 0)
      s.insert(0,1,'0');
    while(a){
      s.insert(0,1,a%10 + '0');
      a /= 10;
    }
    return s;
  }

  string convitoa(int num){ //将一個整數轉換為字元串	
    string s;
    if(num == INT_MIN) //注意邊界條件的處理
      s += "-2147483648";
    else  if(num == INT_MAX)
      s += "2147483647";
    else{
      if(num < 0){ //非邊界元素,負數得在字元串之前加'-',然後将其相反數轉換為字元串添加在字元串尾部
        s.push_back('-');	
        num = -num;
      }
      s += int2str(num); //是非負數,直接轉換為字元串即可
    }
    return s;
  }

  vector<string> summaryRanges(vector<int>& nums) {
    vector<string> vec;
    int len = nums.size();
    if(len == 0)
      return vec;
    if(len == 1){ //處理隻有一個元素的情況                
      vec.push_back(convitoa(nums[0]));
      return vec;
    }  
     
    int i = 0,j = 1,lef = nums[i], rig = nums[j];
    //雙指針來找到連續序列方差為1的起止元素。其中i是起始元素下标,j是尾部元素下标。lef是區間起始元素,rig是區間結束元素
    while(j < len){ 
      if(nums[j] == nums[j-1] + 1) //若相鄰元素相差1,那麼右指針右移
        j++;
      else{ //增量大于1,說明連續序列知道j的前一個元素,那麼将該區間用字元串表示出來,放到結果向量vec中
        lef = nums[i];
        string s;                
        s += convitoa(lef); //将lef轉換位字元串                     
        if(j - i > 1){ //如果該區間的元素個數大于1(即rig>lef),那麼把rig加進來
          rig = nums[j-1];
          s += "->";                    
          s += convitoa(rig);  
        }                         
        vec.push_back(s);
        i = j;
        j++;
      }  
    }

    //處理最後一個連續區間
    lef = nums[i];
    string s;        
    s += convitoa(lef);  
                
    if(j - i > 1){
      rig = nums[j-1];
      s += "->";                    
      s += convitoa(rig);   
    }      
    vec.push_back(s);
    return vec;       
  }
};