如何在C++中對同時包含負數和正數的字符串數組進行排序?




arrays string (2)

另一個解決方案是實現自己的比較功能:

  • 檢查兩個字符串的第一個字符。 如果一個以數字開頭,另一個以 - 開頭,則以 - 開頭的字符串是較小的數字。
  • 如果兩個字符串都以數字開頭,則比較字符串的長度。 字符串越短,數字越小。 如果兩個字符串長度相同,請執行標準字符串比較。
  • 如果兩個字符串都以 - 開頭,則比較字符串的長度。 字符串越長,數字越小。 如果兩個字符串的長度相同,請執行標準字符串比較,但取反結果。
String str[]={"-123","89","-10","456"};

str 是一個字符串數組,每個字符串都為整數格式,您必須在 O(n log n) 時間對該數組執行排序。

str 中的 str 可以表示正整數和負整數。 這些字符串的最大長度為1024個字符。

我知道解決此問題的一種方法是將字符串轉換為數字,然後將它們進行比較。 還有其他解決方案嗎?


這是一個最小且可能不足(無法處理前導零,空白等)的示例,可以滿足您的要求。

這些評論說明了它在做什麼。 :)

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>

int main() {
  std::vector<std::string> strings = {
      "-1", "-1", "-20", "-4", "3", "0", "-0", "1", "20", "20", "44020",
  };

  // Assumes everything in "strings" has no whitespace in it.
  // Assumes everything in "strings" does not have leading zeroes.
  // Assumes everything in "strings" is an ascii representaion of an integer.
  // Assumes everything in "strings" is nonempty.
  std::sort(strings.begin(), strings.end(),
            [](const std::string &a, const std::string &b) {
              const bool a_is_negative = a[0] == '-';
              const bool b_is_negative = b[0] == '-';
              if (a_is_negative != b_is_negative) {
                // If they have different signs, then whichever is negative is
                // smaller.
                return a_is_negative;
              } else if (a.length() != b.length()) {
                // If they have the same sign, then whichever has more
                // characters is larger in magnitude. When the sign is negative,
                // the longer (more digits) number is "more negative". When
                // positive, the longer (more digits) number is "more positive".
                return (a.length() < b.length()) != a_is_negative;
              } else {
                // Otherwise a lexicographic comparison of "a" and "b" will
                // determine which string is larger in magnitude. Using the same
                // logic above, we account for the "negative vs. positive"
                // comparison.
                return (a < b) != a_is_negative;
              }
            });

  for (const auto &str : strings) {
    std::cout << str << " ";
  }
  std::cout << std::endl;
}




sorting