Как отсортировать массив строк, который содержит как отрицательные, так и положительные числа в C ++.? - PullRequest
7 голосов
/ 23 октября 2019
String str[]={"-123","89","-10","456"};

str - это массив строк, каждая строка в формате целого числа, и вы должны выполнить сортировку этого массива за O(n log n) раз.

Строки в str могут представлять как положительные, так и отрицательные целые числа. Максимальная длина этих строк составляет 1024 символа.

Я знаю, что одно из решений этой проблемы - преобразовать строки в числа, а затем сравнить их отдельно от этого;Есть ли другое решение этой проблемы?

Ответы [ 2 ]

12 голосов
/ 23 октября 2019

Другим решением является реализация собственной функции сравнения:

  • Проверьте первый символ обеих строк. Если одна начинается с цифры, а другая начинается с -, то строка, начинающаяся с -, является меньшим числом.
  • Если обе строки начинаются с цифры, сравните длинустроки. Чем короче строка, тем меньше число. Если обе строки имеют одинаковую длину, выполните стандартное сравнение строк.
  • Если обе строки начинаются с -, сравните длину строк. Чем длиннее строка, тем меньше число. Если обе строки имеют одинаковую длину, выполните стандартное сравнение строк, но отмените результат.
11 голосов
/ 23 октября 2019

Вот минимальный и потенциально недостаточный (не обрабатывает лидирующие нули, пробелы и т. Д.) Пример, который делает то, что вам нужно.

Комментарии объясняют, что он делает. :)

#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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...