給定一個可變長度的字符串數組,打印陣列中每個元素的長度。爲陣列的每個元素打印陣列長度
例如,給定:
string[] ex = {"abc", "adf", "df", "ergd", "adfdfd");
輸出應爲:
我考慮
一種可能性是使用鏈表來保存每個字符串的長度,並在插入時進行排序並最終顯示結果。
有效解決此問題的其他建議?
給定一個可變長度的字符串數組,打印陣列中每個元素的長度。爲陣列的每個元素打印陣列長度
例如,給定:
string[] ex = {"abc", "adf", "df", "ergd", "adfdfd");
輸出應爲:
我考慮
一種可能性是使用鏈表來保存每個字符串的長度,並在插入時進行排序並最終顯示結果。
有效解決此問題的其他建議?
根據不同的語言,最簡單的方法可能是通過使用該陣列來迭代for循環
for (i=0;i<array.length;i++){
print array[i].length;
}
你需要打印出來,以便?
來解決這個問題,我們需要按順序打印它們,而不是重複? – find
一個好的,在這種情況下,忽略我的答案,並做勞倫斯說的話 –
每當你想保持一個截然不同的東西(即:過濾出重複的東西),你可能想要一個集合。
存儲集有很多不同的數據結構。其中一些,如搜索樹,也會爲您「排序」這些值。您可以嘗試使用多種形式的二叉搜索樹中的一種。
你現在正在做什麼(或給定的答案)被稱爲插入排序。它基本上比較插入字符串的字符串到插入的長度。之後,在打印時,字符串到打印的長度(在當前指針處)將與其之前和之後的字符串的長度進行比較,如果長度相同,則不要打印!
另一種方法是,冒泡排序,它會在同一時間兩個字符串進行排序,排序,然後移動到下一個字符串...
印刷是在你的程序中最重要的組成部分,不管是什麼你使用的排序算法,沒關係。
下面是冒泡排序和打印處理的算法,它是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
的規定並沒有說明排序或刪除結果中重複的任何問題。只有給定的輸出暗示排序和重複刪除。它沒有提到關於速度或空間優化或可維護性的任何說明。
因此真的沒有足夠的信息來獲得「最佳」解決方案。
如果你想要一個能在大多數語言中工作的解決方案,你可能應該堅持使用一個數組。將長度放入一個新數組中,對其進行排序,然後打印一個循環,該循環記住最後一個值以跳過重複項。我不想用一種無法應付的語言。
如果指定了某種語言,則可能可以利用集合或關聯數組類型數據結構來自動處理重複項和/或排序。例如。,在Java中你可以選擇一個集合類,它會自動忽略重複項和排序,並且你可以構建你的代碼,這樣一行改變使用不同的類會讓你保持重複或不排序。如果您使用的是C#你很可能寫了整個事情作爲一個行LINQ語句...
這裏是一個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):
套件是一種關聯容器tha t存儲獨特的元素, ,其中元素本身就是關鍵。
關聯容器是特別設計成 效率可以通過鍵訪問它的元素的容器(不像序列 容器,這是通過它們的 相對或絕對位置更有效的存取元件)。
在內部,集合中的元素總是按照設置在 容器構造上的特定的嚴格弱排序標準,從低到高排序爲 。
集合通常實現爲二叉查找樹。
我不明白你是如何從該陣列獲得2 3 4 6。陣列中有五個元素,不應該是3 3 2 4 6? – bdonlan
@bdonlan我們需要對它進行排序並避免重複。我們只需要顯示可變長度而不需要重複。 – find
這是你的任務嗎? – dpp