Ich habe das nicht getestet, aber hier ist mein Gedanke:
- Quicksortieren Sie beide Zeichenketten an Ort und Stelle, so dass Sie eine geordnete Folge von Zeichen haben
- Behalten Sie einen Index in beiden Zeichenfolgen, vergleichen Sie das "nächste" Zeichen aus jeder Zeichenfolge, wählen Sie das erste aus und geben Sie es aus, wobei der Index für diese Zeichenfolge erhöht wird.
- Fahren Sie fort, bis Sie das Ende einer der Zeichenketten erreicht haben, und ziehen Sie dann einfach eindeutige Werte aus dem Rest der verbleibenden Zeichenkette.
Benötigt keinen zusätzlichen Speicher, sondern nur die beiden ursprünglichen Zeichenketten, zwei Ganzzahlen und eine Ausgabezeichenkette (oder einen StringBuilder). Als zusätzlicher Bonus werden die Ausgabewerte auch noch sortiert!
Teil 2: Das würde ich schreiben (sorry für die Kommentare, bin neu bei stackoverflow):
private static string intersect(string left, string right)
{
StringBuilder theResult = new StringBuilder();
string sortedLeft = Program.sort(left);
string sortedRight = Program.sort(right);
int leftIndex = 0;
int rightIndex = 0;
// Work though the string with the "first last character".
if (sortedLeft[sortedLeft.Length - 1] > sortedRight[sortedRight.Length - 1])
{
string temp = sortedLeft;
sortedLeft = sortedRight;
sortedRight = temp;
}
char lastChar = default(char);
while (leftIndex < sortedLeft.Length)
{
char nextChar = (sortedLeft[leftIndex] <= sortedRight[rightIndex]) ? sortedLeft[leftIndex++] : sortedRight[rightIndex++];
if (lastChar == nextChar) continue;
theResult.Append(nextChar);
lastChar = nextChar;
}
// Add the remaining characters from the "right" string
while (rightIndex < sortedRight.Length)
{
char nextChar = sortedRight[rightIndex++];
if (lastChar == nextChar) continue;
theResult.Append(nextChar);
lastChar = nextChar;
}
theResult.Append(sortedRight, rightIndex, sortedRight.Length - rightIndex);
return (theResult.ToString());
}
Ich hoffe, das macht mehr Sinn.
3 Stimmen
Er schlägt bereits einen Algorithmus vor und fragt, ob jemand weiß, wie man es besser machen kann.
0 Stimmen
Hey....siehe mein Algo oben, ich muss wissen, ob wir dies in O(n)-Zeit lösen können, ohne zusätzlichen Platz zu verwenden
0 Stimmen
Ich weiß nicht C#, so dass ich nicht weiß, aber wäre dies nicht perfekt für ein Set (wie in Java oder Python gefunden) sein?
0 Stimmen
Ein Satz würde auch zusätzlichen Platz bedeuten.
0 Stimmen
Ich möchte keine eingebaute Set-Datenstruktur verwenden........so würde ich gerne Hash-Tabellen vermeiden, wenn wir eine Lösung ohne sie haben
0 Stimmen
Sie müssen die Zeichenzahl nicht beibehalten, daher kann der Wert in der Hashtabelle ein einfacher Boolescher Wert sein.
0 Stimmen
Nur so nebenbei: Wo machen Sie Ihren Cs-Kurs? Ihre Fragen haben mir bisher gut gefallen. Ihr Ausbilder gibt Ihnen wertvolle Probleme, denn das sind genau die Dinge, auf die Sie stoßen werden, wenn Sie beruflich programmieren.
0 Stimmen
Hallo Tim........ Ich lerne gerade programmieren und habe diese Fragen von net....... übernommen. Es ist cool, dass du meine Fragen magst
0 Stimmen
Nur am Rande: Kann ein Nutzer diese Website ständig als Puffer für die Vorbereitung auf ein Vorstellungsgespräch nutzen? Es sieht so aus, als ob dieser Benutzer zugegeben hat, dass er zu einem Vorstellungsgespräch für eine SDET-Stelle bei Microsoft geht, und alle seine Fragen sind vollständig aus den Microsoft-Vorstellungsfragen ( sellsbrothers.com/fun/msiview/default.aspx?content=question.htm ). Ich weiß, dass er/sie eine psudo-Lösung hinzufügt, aber sie verwenden SO im Wesentlichen als psudocode->c#-Übersetzungsdienst. Ist das ein Fauxpas? Ich frage mich nur <_<
1 Stimmen
Hey TomatoSandwich, Dies ist nur ein Beitrag für die Gemeinschaft, so dass any1 jemand anderes kann dies als Referenz für seine / ihre Vorbereitung verwenden... Und anderen zu helfen ist mein Motiv, außerdem versuche ich alles, um eine erste Lösung zu finden. Ich denke nicht, dass es schadet, Fragen zu stellen, da es sowohl mir als auch anderen hilft.
0 Stimmen
Gibt es eine endgültige Lösung für dieses Problem?