華爲oj【整數排序】

題目

描述: 
實現輸入一組大於等於0的整數,根據從小到大的順序排序後輸出,排序後有連續數時,只輸出連續數中最小和最大的兩個數。

題目類別: 排序 
難度: 高級 
運行時間限制: 10Sec 
內存限制: 128MByte 
階段: 入職前練習 
輸入: 
一組大於等於0的整數,不考慮非法輸入,各個整數之間以逗號(“,”)分隔, 輸入字符串的總長度小於等於100個字節。

輸出: 
排序後的值,各個整數之間以空格分隔。

樣例輸入: 
1,4,3,110,2,90,7

樣例輸出: 
1 4 7 90 110

代碼

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

vector<int> Sort(string str){
    int size = str.size();
    vector<int> vec;
    if(size == 0){
        return vec;
    }//if
    int num = 0;
    // 不用考慮非法輸入
    for(int i = 0;i <= size;++i){
        if(i == size || str[i] == ','){
            vec.push_back(num);
            num = 0;
        }//if
        else if(str[i] >= '0' && str[i] <= '9'){
            num = num * 10 + str[i] - '0';
        }//else
    }//for
    // 排序
    sort(vec.begin(),vec.end());
    int count = vec.size();
    int start = 0;
    for(int i = 1;i <= count;++i){
        if(i == count || vec[i] != vec[i-1]+1){
            // -1標記
            for(int j = start+1;j <= i-2;++j){
                vec[j] = -1;
            }//for
            start = i;
        }//if
    }//for
    return vec;
}

int main(){
    string str;
    vector<int> vec;
    int size;
    //freopen("C:\\Users\\Administrator\\Desktop\\c++.txt","r",stdin);
    while(cin>>str){
        vec = Sort(str);
        size = vec.size();
        for(int i = 0;i < size;++i){
            if(vec[i] == -1){
                continue;
            }//if
           
            else{
                cout<<" "<<vec[i];
            }//else
        }//for
        cout<<endl;
    }//while
    return 0;
}

注意事項:

1.關於標記刪除的理解:首先找到第一個不相鄰的i的位置(此前若有數就是相鄰的),以不相鄰的位置i爲連續數的結尾進行循環,凡是連續輸>=3個的就置中間的數爲-1;否則

不設置-1標記,直接輸出即cout<<" "<<vec[i];

2.-1標記只標記連續數的中間部分(個數>3),以及逗號,這樣循環輸出結果的時候遇到-1就contibe;

3.原代碼裏有個if(i == 0) cout<<vec[i];着實不知道有什麼用,索性刪掉,歡迎指正。

轉自http://blog.csdn.net/sunnyyoona/article/details/46678219

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章