打印阵列中每个元素的数组长度

时间:2011-07-12 00:49:02

标签: data-structures

给定一个可变长度的字符串数组,打印数组中每个元素的长度。

例如,给定:

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

输出应为:

  

2 3 4 6

我正在考虑的一种可能性是使用链表来保存每个字符串长度,并在插入时排序并最终显示结果。

有效解决此问题的其他建议吗?

5 个答案:

答案 0 :(得分:3)

每当您想要维护不同事物的集合(即:过滤掉重复项)时,您可能需要一个集合。

存储集有许多不同的数据结构。其中一些(如搜索树)也会为您“排序”值。您可以尝试使用多种形式的二叉搜索树中的一种。

答案 1 :(得分:1)

您现在正在做什么(或给定答案)称为插入排序。它基本上比较插入字符串的字符串到插入的长度。之后,在打印时,将字符串到打印的长度(在当前指针处)与之前和之后的字符串长度进行比较,如果长度相同,则不要打印!

另一种方法是,冒泡排序,它会一次排序两个字符串,对它们进行排序,然后移动到下一个字符串......

打印是程序中最重要的部分,无论您使用何种排序算法,都无关紧要。

这是一个用于冒泡排序和打印过程的算法,它是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

答案 2 :(得分:1)

如上所述的问题没有说明如何从结果中排序或删除重复项。只有给定的输出才意味着排序和重复删除。它没有说明速度或空间的优化或可写性的写作。

所以确实没有足够的信息来提供“最佳”解决方案。

如果您想要一种适用于大多数语言的解决方案,您可能应该坚持使用数组。将长度放在一个新数组中,对其进行排序,然后在循环中打印,该循环记住最后一个值以跳过重复。我不想使用一种无​​法应付的语言。

如果指定了某种语言,您可以利用set或关联数组类型数据结构来自动处理重复项和/或排序。例如,在Java中,您可以选择一个自动忽略重复项排序的集合类,并且您可以构建代码,以便更改一行以使用不同的类可以让您保留重复项,或者不进行排序。如果你正在使用C#,你可能会把整个事情写成一行LINQ语句......

答案 3 :(得分:1)

这是一个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 

使用set是因为(引自here):

  

集合是一种存储唯一元素的关联容器,   其中元素本身就是关键。

     

关联容器是特别设计的容器   通过键有效地访问其元素(与序列不同)   容器,通过它们访问元素更有效   相对或绝对的位置)。

     

在内部,集合中的元素总是从低到低排序   在设定的特定严格弱排序标准之后更高   集装箱建设。

     

集通常实现为二叉搜索树。

有关vector的详细信息,请参阅stringhere {/ 1}}。

答案 4 :(得分:-1)

根据语言的不同,最简单的方法可能是使用for循环遍历数组

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

你需要按顺序打印它们吗?