C++ Interview Fragen
-
Eben Nichts, es damit funktioniert nur zufällig und darum meinen hier viele, dass man so Strings umdreht, aber mit fast allen anderen Encodings wie UTF-8 usw. geht das so nicht.
Um die Frage halbwegs richtig beantworten zu können, hätte man mindestens nach dem Encoding fragen müssen.
-
hier string reverse in C:
#include <iostream> #include <cstring> void my_swap(char *a, char *b) { char tmp = *a; *a = *b; *b = tmp; } void reverse(char *str) { if(str == NULL) { return; } unsigned long j = strlen(str) - 1; for(unsigned long i = 0; i < strlen(str) / 2; i++) { my_swap(&str[i], &str[j]); j--; } } int main() { // your code goes here char str[] = "Hello world"; reverse(str); std::cout << str << std::endl; return 0; }
-
Um die Frage halbwegs richtig beantworten zu können, hätte man mindestens nach dem Encoding fragen müssen.
Wieso?
void reverse_mbstr( char* str ) { auto const len = std::strlen(str) + 1; auto wstr = std::make_unique<wchar_t[]>(len); std::mbstowcs( wstr.get(), str, len ); std::reverse( wstr.get(), wstr.get() + len - 1 ); std::wcstombs( str, wstr.get(), len ); }(ungetestet)
~Edit²: Formatierung korrigiert...
Edit³: Längenangaben korrigiert...~
-
DieEiOfSeTeiger schrieb:
Eben Nichts, es damit funktioniert nur zufällig und darum meinen hier viele, dass man so Strings umdreht, aber mit fast allen anderen Encodings wie UTF-8 usw. geht das so nicht.
Um die Frage halbwegs richtig beantworten zu können, hätte man mindestens nach dem Encoding fragen müssen.
std::reverse funktioniert also zufällig. Komische Standardbib, nicht wahr

-
Wie definiert man das Umdrehen eines Unicode-Strings? Es gibt ja z.B. für Umlaute eine kanonische Codierung als Kombination aus ¨ + a. Soll man das beim Umdrehen berücksichtigen? Was ist mit Steuerzeichen, die z.B. die Schreibrichtung umkehren?
-
Wie definiert man das Umdrehen eines Unicode-Strings?
Umkehren aller Code-Points? Ich denke, Spezialfälle wie die von dir genannten sollte man in einem Interview nicht berücksichtigen.
-
std::reverse(s, s+strlen(s))reicht doch völlig, Spezialfälle wie Codepoints > 255 sollte man in einem Interview nicht berücksichtigen.
-
Wozu überhaupt etwas machen? Ich denke, Spezialfälle wie Nicht-Palindrome sollte man in einem Interview nicht berücksichtigen.
-
DieEiOfSeTeiger schrieb:
Um die Frage halbwegs richtig beantworten zu können, hätte man mindestens nach dem Encoding fragen müssen.
Nö, die Aufgabe hätte "C-String" definieren müssen. Wenn nichts dabei steht, interpretiere ich C-String als Folge von
chars, die mit einer Null abgeschlossen wird. Und genau das dreht meine Lösung um.
Dass das Ergebnis vorwärts interpretiert noch gültiges UTF-8 sein soll, ist eine willkürliche Unterstellung. Es war schließlich nicht einmal gegeben, dass die Eingabe irgendein bestimmtes Encoding hat. In so eine realitätsferne Aufgabe sollte man IMO nichts hineininterpretieren. Wenn der Interviewer sich etwas Bestimmtes vorgestellt hatte, kann er das immernoch sagen.
-
Arcoth schrieb:
Um die Frage halbwegs richtig beantworten zu können, hätte man mindestens nach dem Encoding fragen müssen.
Wieso?
void reverse_mbstr( char* str ) { auto const len = std::strlen(str) + 1; auto wstr = std::make_unique<wchar_t[]>(len); std::mbstowcs( wstr.get(), str, len ); std::reverse( wstr.get(), wstr.get() + len - 1 ); std::wcstombs( str, wstr.get(), len ); }(ungetestet)
~Edit²: Formatierung korrigiert...
Edit³: Längenangaben korrigiert...~Und was macht dein reverse_mbstr jetzt, wenn der string von Clients mit unterschiedlichem Encoding kommt? Am besten noch gleichzeitig von mehreren Threads.
TyRoXx schrieb:
DieEiOfSeTeiger schrieb:
Um die Frage halbwegs richtig beantworten zu können, hätte man mindestens nach dem Encoding fragen müssen.
Nö, die Aufgabe hätte "C-String" definieren müssen. Wenn nichts dabei steht, interpretiere ich C-String als Folge von
chars, die mit einer Null abgeschlossen wird. Und genau das dreht meine Lösung um.
Dass das Ergebnis vorwärts interpretiert noch gültiges UTF-8 sein soll, ist eine willkürliche Unterstellung. Es war schließlich nicht einmal gegeben, dass die Eingabe irgendein bestimmtes Encoding hat. In so eine realitätsferne Aufgabe sollte man IMO nichts hineininterpretieren. Wenn der Interviewer sich etwas Bestimmtes vorgestellt hatte, kann er das immernoch sagen.Tja, vielleicht wollte der Interviewer garnicht, dass du so eine triviale Aufgabe wie einen ASCII-String umkehren programmierst, sondern er wollte wissen, ob bei unklaren Aufgaben nochmal nachfragst, anstatt Kunden etwas abzuliefern, was sie vielleicht garnicht wollen.
-
Mal ehrlich: Wenn man den durchschnittlichen Interviewer fragt welches Encoding der "C-String" denn hat, wird er sowieso ASCII sagen und innerlich mit den Schultern zucken. Weil
chargleich ASCII undwchar_tgleich "Unicode".
-
Am besten noch gleichzeitig von mehreren Threads.
Dann ersetze durch mbsrtowcs und wcsrtombs. Klärt sich dann auch das andere Problem?
-
TyRoXx schrieb:
DieEiOfSeTeiger schrieb:
Um die Frage halbwegs richtig beantworten zu können, hätte man mindestens nach dem Encoding fragen müssen.
Nö, die Aufgabe hätte "C-String" definieren müssen. Wenn nichts dabei steht, interpretiere ich C-String als Folge von
chars, die mit einer Null abgeschlossen wird. Und genau das dreht meine Lösung um.
Dass das Ergebnis vorwärts interpretiert noch gültiges UTF-8 sein soll, ist eine willkürliche Unterstellung. Es war schließlich nicht einmal gegeben, dass die Eingabe irgendein bestimmtes Encoding hat. In so eine realitätsferne Aufgabe sollte man IMO nichts hineininterpretieren. Wenn der Interviewer sich etwas Bestimmtes vorgestellt hatte, kann er das immernoch sagen.
Ist doch ein netter Schnelltest, um Vollnichtskönner zu entdecken. Bringt er da einen O(N^2), wird er sehr sehr traurig angeschaut. Das muss auch nichtmal den Ausschluss bedeuten, wenns sonst ok ist, kann man da flexibel sein, ihm nen Sedgewick leihen und das vertagen.
Ich halte das eh für eine schlimme Fehlentwicklung, daß Berufsanfänger mit 5+ Jahren Berufserfahrung gesucht werden, die mehr als 20 vorwiegend völlig irrelevante Zeitgeisttechnologien beherrschen und fließend englisch reden. Anstatt daß man sich die Blümchen pflückt und gegebenenfalls ausbildet. Pro Monat 150€ aufs Amazon-Konto für Fachbücher, warum nicht? Hab damals als Programmierer nur einmal freien Zugang zu CACM gehabt, das war bei einem Rüstungsbetrieb. Das sollten viel mehr Softwareschmieden machen. Was ist ein senior programmer? Manchmal nur einer, der mehr Erfahrung hat. Manchmal einer, der auch ein wenig in die Architektur beraten darf. Sein natürlicher Job wäre es, als einer von zehn, mit guter Ahnung über Architektur wie Details, die anderen neun durch Beratung doppelt so effektiv zu machen. Ist doch besser, als die anderen neun weiter sumpfen zu lassen, und ist auch besser, als dem senior programmer Buchführung aufzuhalsen. Der "steigt" auf, bis er kaputtgeht vor lauter Wirtschaftskacke.
Jetzt sagt Arcoth gleich, "Menno, wer im Info-Studium nicht wenigstens so viel rafft, daß er einen strrev inplace nicht in O(n) packt, der ist arbeitsmarklicher Sondermüll." Ich sage dagegen "Er hat das Studium gepackt, damit weist er nach, daß er sich sehr viele Sachen innerhalb kurzer Zeit in den Kopf hauen kann und damit gut genug operieren kann, um die Klausur zu bestehen. So Leute braucht jeder. Was er konkret da gelernt hat, ist egal, ist auch je nach Studiengang meistens 30 bis 100 Jahre veraltet. Er kanns sich reinknallen, dem kann ich am Donnerstag eine neue Zeitgeisttechnologie vor den Latz knallen und ein gutes Handbuch und am Montag schon ist er produktiv."
Viele Stellenanzeigen suchen nur nach welchen, die was technisches studiert haben. Egal was sie studier haben!!! Kommt eh nicht drauf an, was sie gelernt haben. Kommt drauf an, daß sie lernen können.
So ne Programmierfrage ist ja auch ein Aufhänger, um weiterzufragen.
wernerschwarz//mit kommentaren schrieb:
hier string reverse in C://aha, also C
#include <iostream>//aha, also C++ #include <cstring> void my_swap(char *a, char *b) {//Wäre in C++ nicht so sinnig. char tmp = *a; *a = *b; *b = tmp; } void reverse(char *str) { if(str == NULL) {//assert? //(1) return; } unsigned long j = strlen(str) - 1;//schön, strlen zu bevorzugen vor eigenen //Schleifen for(unsigned long i = 0; i < strlen(str) / 2; i++) {//size_t //Warum das /2 dort? my_swap(&str[i], &str[j]); j--;//j hier zu dekrementieren wirkt asymmetisch //wenn man j mitführem mag, warum nicht i<j? } } int main() { // your code goes here char str[] = "Hello world"; reverse(str); std::cout << str << std::endl;//endl statt '\n'? return 0;//warum? }Mal kurz schnacken drüber, alle angesprochenen Details sind an sich wurst, kann man mit ihm über sowas schnacken? Hat er Alternativen in petto?
Wenn ich (1) anspräche, wäre mir wichtig, daß er fragte, wie es im Unternehmen üblich ist. Wenn wir da auf Abwegen wandeln würden, möge er ruhig klar sagen, daß er das für kacke hält, aber notwenig ist, daß er synchron kackt und statt privater Abweichungen lieber so lange berät, bis generell andersrum gekackt wird.
-
@volkard: die schleife muss ja nur bis zu strlen/2 laufen, da swap ja immer den anfangs-character mit dem end-character tauscht.
"Hello World"
1. durchlauf: "dello WorlH"
2. durchlauf: "dlllo WoreH"
3. durchlauf: "dlrlo WoleH"
4. durchlauf: "dlroo WlleH"
5. durchlauf: "dlroW olleH"falls ich jetzt keinen fehler gemacht habe...
-
wernerschwarz schrieb:
@volkard: die schleife muss ja nur bis zu strlen/2 laufen, da swap ja immer den anfangs-character mit dem end-character tauscht.
"Hello World"
1. durchlauf: "dello WorlH"
2. durchlauf: "dlllo WoreH"
3. durchlauf: "dlrlo WoleH"
4. durchlauf: "dlroo WlleH"
5. durchlauf: "dlroW olleH"falls ich jetzt keinen fehler gemacht habe...
Ja. Das /2 ist notwendig. Altprogrammierer hätten es rausgezogen.
unsigned long anzDrchlf = (strlen(str) - 1)/2; for(unsigned long i = 0; i < anzDrchlf; i++) {Sowas können optimierende Compiler aber schon seit 25 Jahren. Macht den Code nur häßlicher.
Ein a(Anruf kommt mitem in Editieren, der dauer länger...)
for(unsigned long i=0,j=strlen()-1; i<j ;i++,j--) swap(i,j)Wobei ich da lieber eine while-Schleife hätte. Nicht zu viel Krempel in eine Zeile.
-
volkard: ja, bin deiner meinung, aber wird sich wahrscheinlich nicht besonders auf die laufzeit auswirken

die lange deklaration der schleife ist auch gewoehnungsbeduerftig

-
Was wird sich nicht besonders auf die Laufzeit auswirken? Das /2 oder das strlen() im Schleifenkopf?
Das strlen() im Schleifenkopf ist übel. Das wird der Compiler nicht wegoptimieren können...
O(N^2)
-
Jetzt sagt Arcoth gleich, "Menno, wer im Info-Studium nicht wenigstens so viel rafft, daß er einen strrev inplace nicht in O(n) packt, der ist arbeitsmarklicher Sondermüll."
Nein, wer im Info-Studium nicht wenigstens so viel rafft, dass er beweisen kann dass 3SAT NP-vollständig ist, hat einfach nicht aufgepasst. Und wenn jemand nicht aufpasst, wieso sollte ihn dann jemand schulen wollen?
Wenn jemand strlen in den Schleifenkopf schmeisst, dann hat er kein Auge für
kleinewichtigeDetailsDinge. Du hast es - hast mal erzählt, du hättest in einem kleinen Code-Schnipsel direkt den Fehler gesehen, an dem sich deine Kameraden den Kopf zerbrochen haben (im letzten Ausdruck vonforwurden zwei Integrale dividiert). Und wenn deine Buben das nicht gesehen haben, ist's problematisch, gell.Er kanns sich reinknallen, dem kann ich am Donnerstag eine neue Zeitgeisttechnologie vor den Latz knallen und ein gutes Handbuch und am Montag schon ist er produktiv.
So Erfahrungen hast du gemacht, gell? Erzähl'!
-
Arcoth schrieb:
Jetzt sagt Arcoth gleich, "Menno, wer im Info-Studium nicht wenigstens so viel rafft, daß er einen strrev inplace nicht in O(n) packt, der ist arbeitsmarklicher Sondermüll."
Nein, wer im Info-Studium nicht wenigstens so viel rafft, dass er beweisen kann dass 3SAT NP-vollständig ist, hat einfach nicht aufgepasst. Und wenn jemand nicht aufpasst, wieso sollte ihn dann jemand schulen wollen?
Als ich zur Fachschaft kam sagten mir die alten Hasen "Musst keinen eigenen Rechner haben. Musst auch nicht programmieren lernen wie ein Affe. Informatik ist was viel höherwertiges." Was verdammt ist "Informatik"? Ich studiere hier einen Scheiß und weiß nicht, was es ist.
Später begriff ich, daß die alten Hasen deswegen nicht programmieren können müssen, weil sie höhere Aufgaben machen, nämlich wie Datenbankdesign und so. Alles klar. "Informatiker" machen die Pläne und hergelaufene Polen/Chinesen/Inder proggern das aus.
Ein wenig später begriff ich, daß die alten Fachschaftshasen deswegen alte Hasen sind, weil sie ihr Studium nicht hinkriegen, es sind "alte" Hasen. Aber sie hatten voll viel Ahnung, konnten Linux-Rechner aufsetzen und so, das war nir damals noch fremd.
Hab mich ein wenig von ihnen getrennt. Hab's ihnen nicht so geglaubt. Nee, wer nicht wenigstens rudimentär proggern kann, der kann kein Gefühl dafür haben, wie so Sachen skalieren. So würde ich es heute ausdrücken. Damals hatte ich es einfach nur fett im Gefühl, daß jemand, der überhaupt gar nicht proggern kann, daß der auch keine Projektverantwortung in Sachen Software haben darf.
"dass 3SAT NP-vollständig ist"
Ähm, das war mir bisher schnuppe.
Würde es eines Deiner Projekte besser machen? Würde es das Maut-Dilemma verhindert haben, wenn die Eintscheidungsträger das wüßten?edit: Weil *Du* es wichtig findest, schaffe ich mir das gerade mal noch mal an.
Arcoth schrieb:
Wenn jemand strlen in den Schleifenkopf schmeisst, dann hat er kein Auge für
kleinewichtigeDetailsDinge. Du hast es - hast mal erzählt, du hättest in einem kleinen Code-Schnipsel direkt den Fehler gesehen, an dem sich deine Kameraden den Kopf zerbrochen haben (im letzten Ausdruck vonforwurden zwei Integrale dividiert). Und wenn deine Buben das nicht gesehen haben, ist's problematisch, gell.int a,b,n; … for(double x=a;x<=b;x+=(b-a)/n;//oder so, aber ähnlichDie beiden verzweifelten nen Tag lang und mehr und ich sah es im Augenschein. Nuja, der eine ist voll aufgestiegen und der andere nicht. Ob man diesen Popelfehler schon früh im Studium erkennt, sollte kein Maß sein normalerweise. Kinkerlitzchen, darauf fällt jeder mal rein, einmal, zweimal, zehnmal, hat mit der eingespielten Produktivität wenig zu tun.
edit: Haha! Ich bin sogar der Vollidiot vor der Herrn! Was ich schon für viele Fehler gemacht habe! Kannste Dir gar nicht vorstellen. Diverse Programmiersprachen auch noch. Gelegentlich halte ich Seminare, wo die Teilnehmer am Rechner üben. Da meldet sich jemand und sagt einen halben Satz, sattt mich erstmal herkommen zu lassen (im Forum wäre das Stammeln und den Code nicht zeigen) und ich sage ihm, wo er sich vertippt hat. Das kann ich nur, weil ich mehr als hundert mal diesen Fehler auch gemacht habe.
Arcoth schrieb:
Er kanns sich reinknallen, dem kann ich am Donnerstag eine neue Zeitgeisttechnologie vor den Latz knallen und ein gutes Handbuch und am Montag schon ist er produktiv.
So Erfahrungen hast du gemacht, gell? Erzähl'!
Absolut. Hab immer am Freitag schon anschaffen können. Mein Problem, wie ich es mir in den Kopf knalle, der Auftraggeber kriegt den "volkard kann es Dir besorgen".
-
edit: Weil *Du* es wichtig findest, schaffe ich mir das gerade mal noch mal an.
Ich finde es absolut irrelevant für das Proggern. Nur mache ich folgende (bitte zu korrigierende Annahmen):
- Wenn jemand sich für ein Fach begeistern kann, geht er auf die Uni
- Wenn er immer noch vom Fach begeistert ist, begeistert genug nicht abzubrechen, dann lernt er, was er lernen soll (und will)
- Genug gelernt, um das Abschlussexamen zu bestehen, hat jemand, der auch das Cook-Levin Theorem beweisen kann (da so etwas ja zu den Basislektionen in Komplexitätstheorie aka theoretischer Informatik gehört)
- Wenn jemand auf der Universität etwas gelernt hat, verlernt er es nicht so schnell.
- Du bist Fuffzig, daher hast du eine Rechtfertigung für den vorhergehenden Stichpunkt.Edit:
Absolut. Hab immer am Freitag schon anschaffen können. Mein Problem, wie ich es mir in den Kopf knalle, der Auftraggeber kriegt den "volkard kann es Dir besorgen".
:'D