程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> [LeetCode] Summary Ranges

[LeetCode] Summary Ranges

編輯:關於C++

Summary Ranges

 

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.

解題思路:

這道題題意是,將相鄰的一組數據用區間表示。雖然mark為easy,但是麻雀雖小,卻五髒俱全,有很多陷阱的問題。

1、最開始想的是如下代碼。但有幾個問題需要注意一下。一個就是可能溢出問題,這體現在兩個方面,一個是自行編寫的數字轉字符串的代碼中,另一個是在判斷兩個數是否相鄰。因為對c++不夠了解,因此竟然不知道如何將數字轉化成字符串,於是動手寫了一個。囧。這個版本的代碼就像懶婆娘的裹腳布一樣。

 

class Solution {
public:
    vector summaryRanges(vector& nums) {
        int len = nums.size();
        vector result;
        if(len == 0){
            return result;
        }
        int left = nums[0];
        nums.push_back(nums[len-1]);
        len++;
        for(int i=1; i 1)){
                if(left == nums[i-1]){
                    result.push_back(intToString(left));
                }else{
                    result.push_back(intToString(left) + -> + intToString(nums[i-1]));
                }
                left = nums[i];
            }
        }
        return result;
    }
    
    string intToString(int n){
        if(n==0){
            return 0;
        }
        long long lN = n;
        string s = ;
        if(lN<0){
            s = -;
            lN = -lN;
        }
        stack stacks;
        while(lN!=0){
            stacks.push(lN%10 + '0');
            lN = lN/10;
        }
        while(!stacks.empty()){
            s += stacks.top();
            stacks.pop();
        }
        return s;
    }
};
2、其實c++中可以直接將數字轉化成字符串的。在頭文件中,有這麼一個方法to_string。另外,判斷是否相鄰應該用不等號。因此,精簡後的代碼如下。以上兩個版本都是先在後面添加一個哨兵數據。

 

 

class Solution {
public:
    vector summaryRanges(vector& nums) {
        int len = nums.size();
        vector result;
        if(len == 0){
            return result;
        }
        int left = nums[0];
        nums.push_back(nums[len-1]);
        len++;
        for(int i=1; i + to_string(nums[i-1]));
                }
                left = nums[i];
            }
        }
        return result;
    }
};
3、在網上找到另外一種解決方案,非常優雅,其答題思路就是找到每個區間的左右兩個端點,且無需哨兵。

 

 

class Solution {
public:
    vector summaryRanges(vector& nums) {
        int len = nums.size();
        int i=0;
        vector result;
        while(i + to_string(nums[i + j - 1]));
            i += j;
        }
        return result;
    }
};


 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved