Donnerstag, Mai 28, 2020

C-Programm zu entfernen, wiederholt char aus einem string

Stieß ich auf eine interview-Frage, die gestellt zu löschen, der wiederholte Zeichen aus einer angegebenen Zeichenfolge, in-place.
Also, wenn die Eingabe war „Hallo“ die Ausgabe zu erwarten war „hi ter“. Es wurde auch gesagt, um zu prüfen, nur alphabetische repititions und alle
Alphabete wurden Kleinschreibung. Ich kam mit dem folgenden Programm. Ich habe Kommentare zu machen, meine Logik, klar. Aber das Programm funktioniert nicht wie expectd für einige Eingaben. Wenn die Eingabe „hii“ es funktioniert, aber wenn die „hi there“ gelingt es nicht. Bitte helfen Sie.

#include <stdio.h>
int main() 
{
    char str[] = "programming is really cool"; //original string.
    char hash[26] = {0}; //hash table.
    int i,j; //loop counter.
//iterate through the input string char by char.
for(i=0,j=0;str[i];)
{
    //if the char is not hashed.
    if(!hash[str[i] - 'a'])
    {
        //hash it.
        hash[str[i] - 'a'] = 1;
        //copy the char at index i to index j.
        str[j++] = str[i++];
    }
    else
    {
        //move to next char of the original string.
        //do not increment j, so that later we can over-write the repeated char.
        i++;
    }
}

//add a null char.
str[j] = 0;

//print it.
printf("%s\n",str); //"progamin s ely c" expected.

return 0;

}

  • Haben Sie einen Tippfehler gemacht in der erwarteten Ausgang; sollte es nicht sein „Hallo“ -> „Hallo ter“ oder „Hallo“ -> „Hi ther“?
  • Dass man Funktionen, die ein assoziatives array ist, aber definitiv nicht eine hash-Tabelle.
InformationsquelleAutor Zacky112 | 2010-02-11

7 Kommentare

  1. 11

    wenn str[i] ist eine non-alphabet, sagen, ein Raum und wenn Sie das tun:

    hash[str[i] - 'a']

    Ihrem Programm Blasen kann.

    ASCII-Wert von space ist 32 und der a ist 97 so sind Sie effektiv den Zugriff auf hash-array mit einem negativen index.

    Um dieses Problem zu lösen Sie können Sie ignorieren, nicht-Alphabete by doing :

    if(! isalpha(str[i]) {
        str[j++] = str[i++]; //copy the char.
        continue;  //ignore rest of the loop.
    }
    • Sie müssen möglicherweise tatsächlich eine explizite Prüfung für die Kleinschreibung nur wie gut?
  2. 2

    Dies ist zu brechen auf alle Leerzeichen (oder irgendetwas anderes außerhalb des Bereichs ‚a‘..’z‘), weil Sie den Zugriff auf die außerhalb der Grenzen Ihres hash-array.

  3. 2
    void striprepeatedchars(char *str)
    {
        int seen[UCHAR_MAX + 1];
        char *c, *n;
    
        memset(seen, 0, sizeof(seen));
    
        c = n = str;
        while (*n != '\0') {
            if (!isalpha(*n) || !seen[(unsigned char) *n]) {
                *c = *n;
                seen[(unsigned char) *n]++;
                c++;
            }
            n++;
        }
        *c = '\0';
    }
  4. 2

    Dies ist der code, golf, richtig?

    d(s){char*i=s,*o=s;for(;*i;++i)!memchr(s,*i,o-s)?*o++=*i:0;*o=0;}
    • Sie sollte ignorieren Sie die Leerzeichen.
    • Sollten Sie post, dass IOCCC… 😉
  5. 1

    //iterate through the input string char by char.
    for(i=0,j=0;str[i];)
    {
      if (str[i] == ' ')
      {
        str[j++] = str[i++];
        continue;
      }
    
        //if the char is not hashed.
        if(!hash[str[i] - 'a'])
        {

    • Wenn es ein non-alphabet andere als Raum, sagen, wie ein ‚?‘, dieses wird wieder scheitern.
  6. 1
    #include <stdio.h>
    #include <string.h>
    
    int hash[26] = {0};
    
    static int in_valid_range (char c);
    static int get_hash_code (char c);
    
    static char * 
    remove_repeated_char (char *s)
    {
      size_t len = strlen (s);
      size_t i, j = 0;
      for (i = 0; i < len; ++i)
        {
          if (in_valid_range (s[i]))
        {
          int h = get_hash_code (s[i]);
          if (!hash[h])
            {
              s[j++] = s[i];
              hash[h] = 1;
            }
        }
          else
        {
          s[j++] = s[i];
        }
        }
      s[j] = 0;
      return s;
    }
    
    int
    main (int argc, char **argv)
    {
      printf ("%s\n", remove_repeated_char (argv[1]));
      return 0;
    }
    
    static int 
    in_valid_range (char c)
    {
      return (c >= 'a' && c <= 'z');
    }
    
    static int 
    get_hash_code (char c)
    {
      return (int) (c - 'a');
    }
    • Zwei Dinge: in_valid_range() ist nur islower(), so kann aus Gründen der Kürze entfernt; get_hash_code() (und alle Behandlungen von hash-codes) sollte nicht signiert werden, da „char“ kann nicht sein, also (int) (c – ‚a‘) kann negativ sein.
  7. 1
    char *s;
    int i = 0;
    
    for (i = 0; s[i]; i++)
    {
        int j;
        int gap = 0;
        for (j = i + 1; s[j]; j++)
        {
            if (gap > 0)
                s[j] = s[j + gap];
            if (!s[j])
                break;
            while (s[i] == s[j])
            {
                s[j] = s[j + gap + 1];
                gap++;
            }
        }
    }

Kostenlose Online-Tests