给定一个可变长度的字符串数组,打印数组中每个元素的长度。
例如,给定:
string[] ex = {"abc", "adf", "df", "ergd", "adfdfd");
输出应为:
2 3 4 6
我正在考虑的一种可能性是使用链表来保存每个字符串长度,并在插入时排序并最终显示结果。
有效解决此问题的其他建议吗?
答案 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
的详细信息,请参阅string
和here {/ 1}}。
答案 4 :(得分:-1)
根据语言的不同,最简单的方法可能是使用for循环遍历数组
for (i=0;i<array.length;i++){
print array[i].length;
}
你需要按顺序打印它们吗?