Вывести длину массива для каждого элемента массива - PullRequest
0 голосов
/ 12 июля 2011

Если задан строковый массив переменной длины, выведите длину каждого элемента в массиве.

Например, с учетом:

string[] ex = {"abc", "adf", "df", "ergd", "adfdfd");

Выходные данные должны быть:

2 3 4 6

Одна из возможностей, которую я рассматриваю, состоит в том, чтобы использовать связанный список для сохранения каждой длины строки и сортировки при вставке и, наконец, отображении результатов.

Любые другие предложения для эффективных решений этой проблемы?

Ответы [ 5 ]

3 голосов
/ 12 июля 2011

Всякий раз, когда вы хотите сохранить коллекцию различных вещей (т.е. отфильтровать дубликаты), вы, вероятно, захотите набор.

Существует множество различных структур данных для хранения наборов. Некоторые из них, такие как деревья поиска, также «сортируют» значения для вас. Вы можете попробовать использовать одну из многих форм двоичных деревьев поиска.

1 голос
/ 12 июля 2011

Вот решение C ++:

#include <set>
#include <vector>
#include <string>
#include <iostream>

using namespace std;

int main()
{
  string strarr[] = {"abc", "adf", "df", "ergd", "adfsgf"};
  vector< string > vstr(strarr, strarr + 5);
  set< size_t > s;

  for (size_t i = 0; i < vstr.size(); i++)
  {
    s.insert( vstr[i].size() );
  }

  for (set<size_t>::iterator ii = s.begin(); ii != s.end(); ii++)
    cout << *ii << " ";
  cout << endl;

  return 0;
}

Вывод:

$ g++ -o set-str set-str.cpp 
$ ./set-str 
2 3 4 6 

A set используется потому, что (цитирование здесь ):

Наборы являются своего рода ассоциативным контейнером, в котором хранятся уникальные элементы, и в котором сами элементы являются ключами.

Ассоциативные контейнеры - это контейнеры, специально предназначенные для эффективного доступа к его элементам по их ключу.(в отличие от контейнеров последовательностей, которые более эффективно обращаются к элементам по их относительному или абсолютному положению).

Внутренне, элементы в наборе всегда сортируются от нижнего к более высокому в соответствии с определенным строгим критерием слабого упорядочения, установленным при построении контейнера..

Наборы обычно реализуются как двоичные деревья поиска.

А подробности по vector см. здесь и здесь для string.

1 голос
/ 12 июля 2011

В указанном вопросе ничего не говорится о сортировке или удалении дубликатов из результатов.Только данный вывод подразумевает сортировку и удаление дубликатов.В нем ничего не говорится об оптимизации скорости или пространства или записи для удобства обслуживания.

Так что действительно не хватает информации для "лучшего" решения.

Если вам нужно решение, которое будет работать на большинстве языков, вам, вероятно, следует придерживаться массива.Поместите длины в новый массив, отсортируйте его, затем напечатайте в цикле, который запоминает последнее значение, чтобы пропустить дубликаты.Я бы не хотел использовать язык, который не справлялся бы с этим.

Если указан язык, вы можете воспользоваться преимуществами набора или связывания структур данных типа массива для обработки дубликатов и / илисортировка автоматически.Например, в Java вы можете выбрать класс коллекции, который автоматически игнорирует дубликаты и , и вы могли бы структурировать свой код так, чтобы изменение одной строки для использования другого класса позволяло вам сохранять дубликаты или не сортировать.Если вы используете C #, вы, вероятно, могли бы написать все это в виде однострочного оператора LINQ ...

1 голос
/ 12 июля 2011

То, что вы делаете сейчас (или данный ответ), называется сортировкой вставки. Он в основном сравнивает длину строки для вставки из вставленных строк. После этого при печати длина строки для печати (по текущему указателю) будет сравниваться с длиной строки до нее и после нее, если она имеет одинаковую длину, не печатать!

Другой подход, сортировка по пузырькам, будет сортировать две строки за раз, сортировать их, а затем переходить к следующей строке ...

Печать является самой важной частью вашей программы, независимо от того, какой алгоритм сортировки вы используете, это не имеет значения.

Вот алгоритм сортировки пузырьков и процесса печати, это VB, так что просто конвертируйте его ...

    Dim YourString(4) As String
    YourString(0) = "12345" 'Will not be printed
    YourString(1) = "12345" 'Will not be printed
    YourString(2) = "123"   'Will be printed
    YourString(3) = "1234"  'Will be printed

    Dim RoundLimit As Integer = YourString.Length - 2

    'Outer loop for how many times we will sort the whole array...
    For CycleCounter = 0 To RoundLimit
        Dim CompareCounter As Integer

        'Inner loop to compare strings...
        For CompareCounter = 0 To RoundLimit - CycleCounter - 1

            'Compare lengths... If the first is greater, sort! Note: this is ascending
            If YourString(CompareCounter).Length > YourString(CompareCounter + 1).Length Then
                'Sorting process... 
                Dim TempString = YourString(CompareCounter)
                YourString(CompareCounter) = YourString(CompareCounter + 1)
                YourString(CompareCounter + 1) = TempString
            End If

        Next
    Next

    'Cycles = Array length - 2 , so we have 2 cycles here
    'First Cycle!!!
    '"12345","12345","123","1234" Compare 1: index 0 and 1 no changes
    '"12345","123","12345","1234" Compare 2: index 1 and 2 changed
    '"12345","123","1234","12345" Compare 3: index 2 and 3 changed
    'Second Cycle!!!
    '"123","12345","1234","12345" Compare 1: index 0 and 1 changed
    '"123","1234","12345","12345" Compare 2: index 1 and 2 changed
    '"123","1234","12345","12345" Compare 3: index 2 and 3 no changes
    'No more cycle!

    'Now print it! Or use messagebox...


    Dim CompareLimit As Integer = YourString.Length - 2

    For CycleCounter = 0 To CompareLimit
        'If length is equal to next string or the preceeding string, do not print...

        If ((CycleCounter - 1) <> -1) Then 'Check if index exist
            If YourString(CycleCounter).Length = YourString(CycleCounter - 1).Length Then
                Continue For 'The length is not unique, exit compare, go to next iteration...
            End If
        End If

        If ((CycleCounter + 1) <> YourString.Length - 1) Then 'Check if index exist
            If YourString(CycleCounter).Length = YourString(CycleCounter + 1).Length Then
                Continue For 'The length is not unique, exit compare, go to next iteration...
            End If
        End If

        'All test passed, the length is unique, show a dialog!
        MsgBox(YourString(CycleCounter))
    Next
0 голосов
/ 12 июля 2011

В зависимости от языка, самым простым способом может быть перебор массива с использованием цикла for

for (i=0;i<array.length;i++){
  print array[i].length;
}

вам нужно распечатать их по порядку?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...