1. 程式人生 > >第一次只出現一次的字元(程式設計師面試題精選100題)

第一次只出現一次的字元(程式設計師面試題精選100題)

題目:在一個字串中找到第一個只出現一次的字元。如輸入abaccdeff,則輸出b。

分析:這道題是2006年google的一道筆試題。

方法一

        最直觀的想法是從頭開始掃描這個字串中的每個字元。當訪問到某字元時拿這個字元和後面的每個字元相比較,如果在後面沒有發現重複的字元,則該字元就是隻出現一次的字元。如果字串有n個字元,每個字元可能與後面的O(n)個字元相比較,因此這種思路時間複雜度是O(n2)。

char findonce(char * str){
        if (NULL == str)
               return '\0' ;
        for (int i = 0;str[i] != '\0';i++){
               int j = i+1;
               while (str[j]!= '\0' ){
                      if (str[j] != str[i])
                           j++;
                      else
                            break ;
              }
               if (str[j] == '\0' )
                      return str[i];
       }
        return '\0' ;
}

方法二

        我們試著去找一個更快的方法。由於題目與字元出現的次數相關,我們是不是可以統計每個字元在該字串中出現的次數?要達到這個目的,我們需要一個數據容器來存放每個字元的出現次數。在這個資料容器中可以根據字元來查詢它出現的次數,也就是說這個容器的作用是把一個字元對映成一個數字。在常用的資料容器中,雜湊表正是這個用途。

        由於字元(char)是一個長度為8的資料型別,因此總共有可能256 種可能。於是我們建立一個長度為256的陣列,每個字母根據其ASCII碼值作為陣列的下標對應陣列的對應項,而陣列中儲存的是每個字元對應的次數。這樣我們就建立了一個大小為256,以字元ASCII碼為鍵值的雜湊表。(256個字元我們建立一個256個數組,陣列用來存放字元的次數,使用字元的ASCII值作為陣列的下標


        我們第一遍掃描這個陣列時,每碰到一個字元,在雜湊表中找到對應的項並把出現的次數增加一次。這樣在進行第二次掃描時,就能直接從雜湊表中得到每個字元出現的次數了。

char FirstNotRepeatingChar(char* pString)
{
      // invalid input
      if(!pString)
            return '\0';

      // 1、初始化
      const int tableSize = 256;
      unsigned int hashTable[tableSize];
      for(unsigned int i = 0; i < tableSize; ++ i)
            hashTable[i] = 0;

      //2、以字元的ASCII作為陣列下標,求每個字元出現的次數
      char* pHashKey = pString;
      while(*(pHashKey) != '\0')
            hashTable[*(pHashKey++)] ++;

      // 3、找到第一次出現一次的字元,就是在陣列中第一次儲存為1所對應的字元
      pHashKey = pString;
      while(*pHashKey != '\0')
      {
            if(hashTable[*pHashKey] == 1)
                  return *pHashKey;

            pHashKey++;
      }

      // if the string is empty 
      // or every char in the string appears at least twice
      return '\0';
} 

相關推薦

第一出現字元程式設計師試題精選100

題目:在一個字串中找到第一個只出現一次的字元。如輸入abaccdeff,則輸出b。 分析:這道題是2006年google的一道筆試題。 方法一:         最直觀的想法是從頭開始掃描這個字串中的每個字元。當訪問到某字元時拿這個字元和後面的每個字元相比較,如果在後面沒

[程式設計師試題精選100]4.二叉樹中和為某值的所有路徑

【題目】 輸入一個整數和一棵二元樹。從樹的根結點開始往下訪問一直到葉結點所經過的所有結點形成一條路徑。 打印出和與輸入整數相等的所有路徑。 例如輸入整數22和如下二元樹                                             10

劍指offer34 第一出現字元java

題目 在一個字串(1<=字串長度<=10000,全部由字母組成)中找到第一個只出現一次的字元,並返回它的位置 思路 建立一個雜湊表,第一次掃描的時候,統計每個字元的出現次數。第二次掃描的時候,如果該字元出現的次數為1,則返回這個字元的位置。 程式碼 public

《劍指offer》系列 第一出現字元Java

連結 牛客:第一個只出現一次的字元 題目描述 在一個字串(0<=字串長度<=10000,全部由字母組成)中找到第一個只出現一次的字元,並返回它的位置, 如果沒有則返回 -1(需要區分大小寫). 思路 雜湊表遍歷計數 程式碼 import java

劍指offer——15第一出現字元 && 陣列中重複的數字 && 字元流中第一個不重複的字元

public class Solution { public int FirstNotRepeatingChar(String str) { if(str.length()<=0) return -1; char c[] = str.toC

劍指offer第一出現字元

時間限制:1秒 空間限制:32768K 熱度指數:200407 本題知識點: 字串 題目描述 在一個字串(0<=字串長度<=10000,全部由字母組成)中找到第一個只出現一次的字元,並返回它的位置, 如果沒有則返回 -1(需要區分大小寫). 思路1(Map) im

在一個字串中找到第一出現字元,並返回它的位置, 如果沒有則返回 -1需要區分大小寫

題目:在一個字串(0<=字串長度<=10000,全部由字母組成)中找到第一個只出現一次的字元,並返回它的位置, 如果沒有則返回 -1(需要區分大小寫). 思路:建立資料結構HashMap,可以記錄每個字元對應出現的次數,之後遍歷字串,將對應的值儲存在HashMa

【劍指offer{31-34}】整數中1出現的次數從1到n整數中1出現的次數、把陣列排成最小的數、醜數、第一出現字元

整數中1出現的次數(從1到n整數中1出現的次數) 題目描述 求出1-13的整數中1出現的次數,並算出100-1300的整數中1出現的次數?為此他特別數了一下1~13中包含1的數字有1、10、11、

劍指offer程式設計JAVA實現)——第34第一出現字元

github https://github.com/JasonZhangCauc/JZOffer 劍指offer程式設計題(JAVA實現)——第34題:第一次只出現一次的字元

【LeetCode & 劍指offer刷】字串1:50 第一出現字元387. First Unique Character in a String

【LeetCode & 劍指offer 刷題筆記】目錄(持續更新中...) 387. First Unique Character in a String Given a string, find the first non-repeati

第一出現字元java版

【題目描述】在一個字串(1<=字串長度<=10000,全部由大寫字母組成)中找到第一個只出現一次的字元,並返回它的位置。 【注意】 1.題目中描述字串長度>1, 但是在實際操作中發現,牛客輸入的測試用例中出現了空字串,即長度為0的情況,截止

劍指Offer試題35java版第一出現字元

題目:在字串中找出第一個只出現一次的字元。如輸入"abaccdeff",則輸出'b'. 看到這樣的題目,我們最直觀的想法就是從頭開始掃描這個字串中的字元。當訪問某個字元時拿這個字元和後面的每個字元相比

在一個字串中找到第一出現字元java實現

題目:在一個字串中找到第一個只出現一次的字元。如輸入abaccdeff,則輸出b。 分析:這道題是2006 年google 的一道筆試題。 時間換空間,類似前面時間CSDN討論的一道華為的面試題:在O(n)時間內,得出一個字串每一個字元出現的次數類似; 用到這道題

劍指offer-第一出現字元

題目描述 在一個字串(0<=字串長度<=10000,全部由字母組成) 中找到第一個只出現一次的字元,並返回它的位置, 如果沒有則返回 -1(需要區分大小寫). 解題思路: 1、採用

【劍指offer】試題50:字元流中第一出現字元【C++版本】

題目:字串中第一個只出現一次的字元。 在字串中找出第一個只出現一次的字元。如輸入"abaccdeff" "abaccdeff",則輸出′ b ′  ′b′。 解題思路: 1.使用雜湊表來記錄每個字元出現的次數,因為字元char char為8位,

第一出現字元Java)

題目: 在字串中找出第一個只出現一次的字元。如輸入"abaccdeff",則輸出'b'。 第一思路:藉助於陣列來做。 開闢一個長度為26的陣列,用來存放字串中每個字元出現的次數。這樣第一次掃描去統計這個字串中字元出現的次數,第二次去統計第一個出現結果為1的次數,並輸出對

找到第一出現的字符並返回它的位置Python

出現一次 ret {} baby find highlight int images 返回 s = ‘hellobaby‘ def findchar(s): for i in s: if s.count(i)==1:

劍指offer之第一出現字元

1.題目描述 在一個字串(0<=字串長度<=10000,全部由字母組成)中找到第一個只出現一次的字元,並返回它的位置, 如果沒有則返回 -1(需要區分大小寫). 2.問題分析 第一次遍歷,統計每個字串出現的次數; 第二次遍歷,如果有那個字元出現次數為1,

劍指offer:(35時間效率和空間效率的平衡 :第一出現字元

在一個字串(1<=字串長度<=10000,全部由字母組成)中找到第一個只出現一次的字元,並返回它的位置。 package co.com.jianzhioffer; import java.util.HashMap; import java.util.Map; public

【Java】 劍指offer(50-2) 字元流中第一出現字元 《劍指Offer》Java實現合集 《劍指Offer》Java實現合集

本文參考自《劍指offer》一書,程式碼採用Java語言。 更多:《劍指Offer》Java實現合集   題目    請實現一個函式用來找出字元流中第一個只出現一次的字元。例如,當從字元流中只讀出前兩個字元"go"時,第一個只出現一次的字元是'g'。當從該字元流中讀出前六個字元"go