字符串的输出

时间:2023-01-02 10:50:40

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