剑指offer-第一个只出现一次的字符-字符串和数组

用到的算法都是像冒泡排序,直接选择排序,插入排序

每趟进行处理,这个趟是没有什么实际意义的

变量j一次从头走到尾进行一次循环枚举遍历扫描

一、题目:第一个只出现一次的字符

题目:在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出‘b‘。要求时间复杂度为O(n)

  最直观的想法是从头开始扫描这个字符串中的每个字符。当访问到某字符时拿这个字符和后面的每个字符相比较,如果在后面没有发现重复的字符,则该字符就是只出现一次的字符。如果字符串有n个字符,每个字符可能与后面的O(n)个字符相比较,因此这种思路的时间复杂度是O(n2),但是不满足要求。

二、解题思路:以空间换时间

  为了解决这个问题,我们可以定义一个哈希表(外部空间),其键值(Key)是字符,而值(Value)是该字符出现的次数。

  同时我们还需要从头开始扫描字符串两次:

  (1)第一次扫描字符串时,每扫描到一个字符就在哈希表的对应项中把次数加1。(时间效率O(n))

  (2)第二次扫描时,每扫描到一个字符就能从哈希表中得到该字符出现的次数。这样第一个只出现一次的字符就是符合要求的输出。(时间效率O(n))

  这样算起来,总的时间复杂度仍然是O(n),满足了题目要求,擦一擦汗,感叹:这*装得真有点技术!

  装完了B,开始将这个想法实现为代码

时间: 2024-08-26 23:46:02

剑指offer-第一个只出现一次的字符-字符串和数组的相关文章

剑指Offer - 第一个只出现一次的字符位置

https://www.nowcoder.com/practice/1c82e8cf713b4bbeb2a5b31cf5b0417c?tpId=13&tqId=11187&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述 在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置 代码

剑指Offer——第一个只出现一次的字符

1.题目描述 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写). 2.代码实现 public class Solution { public int FirstNotRepeatingChar(String str) { if (str == null || str.length() == 0) { return -1; } char[] chars = str.toCharArray(); j

剑指Offer-33.第一个只出现一次的字符(C++/Java)

题目: 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写). 分析: 遍历字符串,利用Hashmap将每一个字符出现的值存储起来,然后再遍历字符串,返回第一个字符值为1的索引即可. 程序: C++ class Solution { public: int FirstNotRepeatingChar(string str) { for(int i = 0; i < str.size(); ++

剑指Offer33 第一个只出现一次的字符

1 /************************************************************************* 2 > File Name: 33_FirstNotRepeatChar.c 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年09月02日 星期五 13时43分20秒 6 ********************************

剑指offer35 第一个只出现一次的字符

class Solution { public: int FirstNotRepeatingChar(string str) { if(!str.size()) return -1; int num[256]={0}; for(int i=0;i<str.size();i++) { num[str[i]]++; } int i=0; while(i<str.size()&&num[str[i]]!=1) i++; if(i==str.size()) return -1; els

剑指 offer 第一题: 二维数组中的查找

打算写 图解剑指 offer 66 题 的系列文章,不知道大家有没有兴趣 ?? 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 题目分析 图 1 如果没有头绪的话,很显然使用 暴力解法 是完全可以解决该问题的. 即遍历二维数组中的每一个元素,时间复杂度:O(n^2). 其实到这里我们就可以发现,使用这种暴力解法并没有充分利用题目给出的信息.这

《剑指offer》第五十题II:字符流中第一个只出现一次的字符

// 面试题50(二):字符流中第一个只出现一次的字符 // 题目:请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从 // 字符流中只读出前两个字符"go"时,第一个只出现一次的字符是'g'.当从该字 // 符流中读出前六个字符"google"时,第一个只出现一次的字符是'l'. #include <cstdio> #include <vector> #include <limits> using namespac

剑指Offer--第50题 第一次只出现一次的字符

题目一: 字符串中第一个只出现一次的字符.在字符串中找出第一个只出现一次的字符.如输入"abaccdeff",则输出'b'. 思路 利用数组第一次遍历字符串记录所有字符出现的次数,第二次查找value值为1的为所需要的,这里用数组比较合适,用HashMap会有问题,比如"google",得出的结果会是e,其实应该是l. 按思路写的代码 package solution; public class Solution26 { public static char sho

剑指offer第一题:二维数组的查找(python)

题目描述: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路: 应当从数组的左下角或右上角开始判断,以左下角为例,若整数小于左下角数值,则最后一行不用考虑.若整数大于左下角数值,则第一列不用考虑.不断缩小范围. 1 # -*- coding:utf-8 -*- 2 class Solution: 3 # array 二维列表 4 def Find(