面试题之在字符串中查找出第一个只出现一次的字符的位置

样例:比如“abcdabc”,第一个只出现一次的字符为d,位置为3

解决方案1:O(n*n)的复杂度

遍历字符串中的每个字符,然后用该字符在字符串中进行查找,如果没有找到和当前字符相同的字符。则当前字符为第一个 只出现一次的字符。

解决方案2:O(n)的复杂度

采取空间换时间的策略

开一个辅助数组,做哈希映射

第一次扫描时,更新在辅助数组中当前字符出现的次数。

hash查找的时间复杂度为o(1)。

第二次扫描时,在辅助数组中通过查辅助数组看当前字符是否只出现了一次,从头到尾的顺序遍历保证了“第一个”,辅助数组的查找保证了“只出现一次”。

code:

#include <bits/stdc++.h>
using namespace std;

int main()
{
    string str="abcdabc";
    //在字符串中查找出第一个只出现一次的字符

    //o(n) 空间换时间
    int a[300];
    memset(a,0,sizeof(a));

    //第一次遍历 统计各字符出现次数
    for(int i=0;i<str.length();i++)
    {
        a[str[i]]++;
    }

    //第二次遍历 辅助数组做哈希映射
    int pos=-1;
    for(int i=0;i<str.length();i++)
    {
        if(a[str[i]]==1)
        {
            pos=i;
            break;
        }
    }
    cout<<pos<<endl;
    return 0;
}

原文地址:https://www.cnblogs.com/yinbiao/p/10469880.html

时间: 2024-10-11 17:31:30

面试题之在字符串中查找出第一个只出现一次的字符的位置的相关文章

【c语言】第一个只出现一次的字符题目:在字符串中找出第一个只出现一次的字符

// 第一个只出现一次的字符题目:在字符串中找出第一个只出现一次的字符. // 如输入"abaccdeff",则输出'b'. #include <stdio.h> #include <string.h> char find_one(char *str) { int a[256]; int len = strlen(str); int i = 0; memset(a, 0, sizeof(a)); for (i = 0; i<len; i++) { a[st

在字符串中找出第一个只出现一次的字符

题目: 在字符串中找出第一个只出现一次的字符.如输入"abaccdeff",则输出'b'. 题目分析: 对于在字符串中找出第一个出现一次的字符,联系ASCII码表,能够得到有256中不同的字符,可以利用字符的编码,将每个字符的编码作为数组的下表,建立一个有256个元素的数组arr[256],将数组中的每一个元素对应统计字符的个数,从字符串的第一个字符进行遍历,遇到一个字符给对应的数组元素加1,当数组中的其中一个元素变到2,则输出这个元素所对应的数组下表,即就是这个字符的ASCII码.

在字符串中找出第一个只出现一次的字符。 如输入“abaccdeff”,则输出&#39;b&#39;。

在字符串中找出第一个只出现一次的字符. 如输入"abaccdeff",则输出'b'. 这个题加一些要求维度只能为n 代码如下: #include <stdio.h> #include <assert.h> char FLetter(char arry[],int len) {              int letterNumber[256] = {0};              int i = 0;              char *ch  = arr

【C语言】在字符串中找出第一个只出现一次的字符。如输入“abaccdeff”,则输出’b’

//在字符串中找出第一个只出现一次的字符.如输入"abaccdeff",则输出'b' #include <stdio.h> #include <memory.h> char OneTime(char * str) { int data[256]; char *p = str; if (*p == '\0') return '\0'; memset(data, 0, sizeof(data)); while (*p ) { data[*p++]++; //把每种字

【C语言【面试题】【笔试题】题目:在字符串中找出第一个只出现一次的字符。

#include<stdio.h> int main() { char *p="abacceeff"; char arr[256]={0}; char *ptr=p; while(*p) { arr[*p]++; p++; } p=ptr; while(*p) { if(arr[*p]==1) printf("%c\n",*p); p++; } return 0; }

在字符串中找出第一个只出现一次的字符。

#include <stdio.h> #include <string.h> char found(char str[]) { int i=0; int j=0; int count; int len=strlen(str); for(i=0;i<len;i++) { count=0;       //每次执行外层循环时count都要置0 for(j=len-1;j>=0;j--) { if(str[i]==str[j]) { count++; } if(count==

在字符串中找出第一个只出现一次的字符串,如输入&quot;abaccdeff&quot;,输出&#39;b&#39;

在字符串中找出第一个只出现一次的字符串,如输入"abaccdeff",输出'b' 1 char firstNotRepeatingChar(char *str) 2 { 3 /* hash表存储 每个可能出现的字符作为索引值 数组内容即为出现的次数 */ 4 char ret = '\0'; 5 // 1.建立hashtable 6 const int size = 256; 7 // 全部初始化为0 8 int hashtable[size] = {0}; 9 char *hashK

在字符串中,寻找第一个只出现一次的字符

在字符串中,寻找第一个只出现一次的字符,如str="abddggdbacdd", 结果是c 三种方法: 1. 使用字符字典数组,每个元素是一个结构体,第一个字段记录字符出现的次数,第二个字段记录该字符在字符串中第一次出现的位置, 先遍历一遍字符串,对字符字典数组赋值,然后遍历一遍字符字典数组,找到第一个字段为1,且位置最小的字符即为需要寻找的字符.如下: struct node{ int num; //出现次数 int index; //首次出现的位置 }; char str[1000

剑指Offer面试题35(java版):第一个只出现一次的字符

题目:在字符串中找出第一个只出现一次的字符.如输入"abaccdeff",则输出'b'. 看到这样的题目,我们最直观的想法就是从头开始扫描这个字符串中的字符.当访问某个字符时拿这个字符和后面的每个字符相比较,如果在后面没有发现重复的字符,则该字符就是只出现一次的字符.如果字符串有n个字符,每个字符可能与后面的O(n)个字符想比较,因此这种思路的时间复杂度为O(n2),面试官不会满意这种思路,它会提示我们继续想更快的思路. 由于题目与字符出现的次数有关,我们是不是可疑统计每个字符在该字符