字符串的輸出

360面試題

  • 將一個字符串中第一次只出現一次的字母打印出來
  • 解決思路
    • 方案一
      • 在讀取到每一個字符,對後方的字符進行遍歷結果,直到有一個只出現一次的字符結束,時間複雜度高
    • 方案二
      • 第一次讀取字符時,採用Hash表存儲字符,當字符出現的次數計入hash表,第二次遍歷字符串中的字符時,讀取到一個在Hash表中的只出現一次的字符就結束了。
#include<stdio.h>
char getOneShowFirst(char *str);
char getOne(char *str);
int main()
{
    char *p ="abcdabcfef";
    char ch ='\0';
    ch = getOneShowFirst(p);
    printf("第一次出現的字符是:%c",ch);
    ch = getOne(p);
    printf("第一次出現的字符是:%c",ch);
}
//使用HashTable可以將複雜率降低,將算法複雜度爲n方的算法,複雜度將爲2n,也就是n
char getOneShowFirst(char *str){
    char hashtable[256] ={0}; //對應assic碼中的所有字符都可以被存儲
    char *p = str;
    char ch='\0';
    //第一次循環用於記錄
    while(*p!='\0')//判斷是否是字符串結束
    {
        ch = *p;
        hashtable[(*p++)]++;//以字符對應的assic碼爲key,然後有一個就加一個        
    }
    p = str;
    //第二次循環用於查找第一個只出現一次的字符
    while(*p!='\0')
    {
        ch = *p;
        if(hashtable[ch]==1)
        {
            break;
        }
    }
    return ch;
}
char getOne(char *str){
    int i = 0;
    int j = 0;
    int len = strlen(str);
    char ch = '\0';
    char *p = str;
    char flag = 0;
    for(i=0;i<len;i++)
    {
        ch = *p;
        for(j=i+1;j<len;j++)
        {
            if(ch == p[j])
            {
                flag = 1;
                break;
            }
        }
        if(flag == 0)
        {
           break;
        }
        flag = 0;
    }
    return ch;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章