2015-08-12 4 views
-1

Следующий код - мое решение для Largest Number. Однако он потерпит крах.Что случилось с strcmp и c_str() здесь?

Если я непосредственно сравнить tampa и tempb в cmp() с помощью tempa > tempb вместо strcmp(), это нормально. Так что тут не так?

#include <iostream> 
#include <string> 
#include <stack> 
#include <vector> 
#include <climits> 
#include <cstdio> 
#include <algorithm> 
#include <sstream> 
#include <cstring> 

using namespace std; 

bool cmp(string a, string b) { 
    string tempa = a + b; 
    string tempb = b + a; 
    int res = strcmp(tempa.c_str(), tempb.c_str()); 
    if (res < 0) { 
     return false; 
    } else return true; 
} 

class Solution { 
public: 
     string largestNumber(vector<int>& nums) { 
     vector<string> str; 
     string res = "0"; 

     if (nums.empty()) { 
      return res; 
     } 

     for (int i = 0; i < nums.size(); ++i) { 
      stringstream ss; 
      ss << nums[i]; 
      str.push_back(ss.str()); 
     } 
     sort(str.begin(), str.end(), cmp); 
     res = ""; 
     for (int i = 0; i < str.size(); ++i) { 
      res += str[i]; 
     } 

     return res[0] == '0' ? "0" : res; 
    } 
}; 

int main() 
{ 
    Solution sol; 
    int data[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; 
    vector<int> nums(data, data + sizeof(data)/sizeof(data[0])); 
    string res = sol.largestNumber(nums); 
    cout << res << endl; 
    return 0; 
} 

ответ

2

Ваше сравнение не эквивалентно tempa > tempb. Это эквивалентно !(tempa < tempb) или tempa >= tempb. А "больше или равно" сравнение не удовлетворяет требованиям std::sort. В частности, сравнение должно быть нерефлексивным, то есть для операнда A cmp(A, A) должно быть ложным, но с >= это правда.

Если вы хотите strcmp эквивалент tempa > tempb, то сделать:

return strcmp(tempa.c_str(), tempb.c_str()) > 0; 

При ближайшем рассмотрении, ваше сравнение принципиально нарушена. Почему вы объединяете a и b вместе для формирования временных строк для сравнения? В качестве простого примера того, что может пойти не так, пустая строка будет сравниваться с любой другой строкой, потому что:

(string("anything") + "") == (string("") + "anything") 
+0

Большое спасибо! Вот и все. Я не знал, что 'cmp' должен быть нерефлексивным раньше. Для этой проблемы сравнение здесь ОК, потому что, учитывая два целых числа «12» и «123», я хочу рассказать, что представляет собой наибольшая конкатенация «12123» или «12312». – tamlok

Смежные вопросы