C++ Interview Fragen



  • volkard schrieb:

    - Schreib eine Funktion, die einen C-String umdreht.

    Hat bisher hier noch keiner richtig beantwortet.



  • TyRoXx schrieb:

    std::reverse(s, s + std::strlen(s));
    


  • Wiederholung macht es auch nicht richtig.

    Ein (C-)(std::)String ist nicht zwangsweise ASCII.



  • Und was hat std::reverse mit Ascii zu tun?



  • 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;
    }
    

  • Mod

    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?


  • Mod

    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 char s, 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 char s, 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 char gleich ASCII und wchar_t gleich "Unicode".


  • Mod

    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 char s, 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 🙂


Anmelden zum Antworten