C++에서 음수와 양수를 모두 포함하는 문자열 배열을 정렬하는 방법은 무엇입니까?



arrays string (2)

또 다른 해결책은 자신의 비교 함수를 구현하는 것입니다.

  • 두 문자열의 첫 문자를 확인하십시오. 하나는 숫자로 시작하고 다른 하나는 - 시작하면 - 로 시작하는 문자열은 작은 숫자입니다.
  • 두 문자열이 숫자로 시작하면 문자열의 길이를 비교하십시오. 더 짧은 문자열은 더 작은 숫자입니다. 두 문자열의 길이가 동일한 경우 표준 문자열 비교를 수행하십시오.
  • 두 문자열이 모두 - 시작하면 문자열의 길이를 비교하십시오. 더 긴 문자열은 더 작은 숫자입니다. 두 문자열의 길이가 동일한 경우 표준 문자열 비교를 수행하되 결과는 무시하십시오.
String str[]={"-123","89","-10","456"};

str 은 문자열 형식이며 각 문자열은 정수 형식이며 O(n log n) 시간 O(n log n) 배열에서 정렬을 수행해야합니다.

str 의 문자열은 양수와 음수를 모두 나타낼 수 있습니다. 이 문자열의 최대 길이는 1024 자입니다.

이 문제의 한 가지 해결책은 문자열을 숫자로 변환 한 다음 이것과 비교하여 비교하는 것입니다. 이 문제에 대한 다른 해결책이 있습니까?


Answer #1

여기에 원하는 것을 수행하는 최소한의 잠재적으로 부족한 (제로 0, 공백 등을 처리하지 않음) 예가 있습니다.

의견은 그 일을 설명합니다. :)

#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