求仅出现一次的最早字符

题目

请实现一个函数用来找出字符流中第一个只出现一次的字符。

例如输入google,输出l

代码

 1     private static Set<Character> filter = new HashSet<>();
 2     private static LinkedList<Character> result = new LinkedList<>();
 3
 4     private static void getFirstChar(String string) {
 5         char[] chars = string.toCharArray();
 6         for (Character ch : chars) {
 7             if (!filter.contains(ch)) {
 8                 int cIndex = result.indexOf(ch);//避免使用contains底层遍历多次
 9                 if (cIndex == -1) {
10                     result.add(ch);
11                 } else {
12                     result.remove(cIndex);//复用
13                     filter.add(ch);
14                 }
15             }
16         }
17         System.out.println(result.size() == 0 ? "#" : result.getFirst());
18     }

上述是我写的代码,后来发现一个学弟写的更好,来贴一下,大家围观~~

 1     public static void findChar(String string) {
 2         char[] chars = new char[256];//所有字符--256,同时此处用char不用Int是为了减少空间
 3         for (int i = 0; i < string.length(); i++) {
 4             chars[string.charAt(i)]++;
 5         }
 6         for (int i = 0; i < string.length(); i++) {
 7             if (chars[string.charAt(i)] == 1) {
 8                 System.out.println(string.charAt(i));
 9                 break;
10             }
11             if (chars[string.charAt(i)] != 1 && i == string.length() - 1) {
12                 System.out.println("#");
13             }
14         }
15     }
时间: 2024-10-21 05:23:49

求仅出现一次的最早字符的相关文章

C++求字符串第一次只出现一次的字符

//求字符串中第一次只出现一次的字符. #include <iostream> #include <string.h> #define _SIZE_ 255 using namespace std; struct Node { int index;//存储下标. int num;//存储个数. Node() :index(-1), num(0){} }; char Grial(char *str) { Node node[_SIZE_];//如果只考虑26个字符就不需要这么多空间.

bzoj1692: [Usaco2007 Dec]队列变换(hash+二分求LCP)

以前一直用SA求LCP,今天学习了一波hash+二分求LCP的姿势,也是nlogn而且常数更小了. hash+二分可以logn比较两个后缀的字典序大小,求出LCP然后比较LCP后一个字符的字典序 #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #define ull unsigned long long using namespace std; ull mul[1

55. 2种方法求字符串的组合[string combination]

[本文链接] http://www.cnblogs.com/hellogiser/p/string-combination.html [题目] 题目:输入一个字符串,输出该字符串中字符的所有组合.举个例子,如果输入abc,它的组合有a.b.c.ab.ac.bc.abc. [分析] 在之前的博文28.字符串的排列[StringPermutation]中讨论了如何用递归的思路求字符串的排列.同样,本题也可以用递归的思路来求字符串的组合. [递归法求组合] 可以考虑求长度为n的字符串中m个字符的组合,

图的应用详解-数据结构

图的应用详解-数据结构 概述 最小生成树——无向连通图的所有生成树中有一棵边的权值总和最小的生成树 拓扑排序 ——由偏序定义得到拓扑有序的操作便是拓扑排序.建立模型是AOV网 关键路径——在AOE-网中有些活动可以并行地进行,所以完成工程的最短时间是从开始点到完成点的最长路径的长度,路径长度最长的路径叫做关键路径(Critical Path). 最短路径——最短路径问题是图研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径. 1.最小生成树 1.1 问题背景:  

天鹅会面

[题目描述] 两头白天鹅生活在一个部分湖面结了冰的湖泊中,湖面的形状为一个长方形,并且被分割成R行C列的小方格,某些方格中结了冰,这样的方格称之为冰格,其余的方格称之为水格.冬天过去了,湖面上的冰渐渐开始溶解了,每一天与水相邻的冰格就将消融而转化为水格.所谓两个方格相邻是指它们在水平或垂直方向有公共边,两个呈对角的方格是不相邻的,下图给出样例数据的演化过程. 白天鹅只能在水中沿水平或垂直方向游动,写一个程序判断多少天后两只白天鹅才能够相会. [输入格式] 输入文件第一行包含两个用空格隔开的整数R

数据结构的一些复习点

数据结构知识点总结 概论 1:数据的结构直接影响算法的选择和效率. 2:数据->数据元素(元素,结点,记录)数据的基本单位->数据项(字段,域)数据不可分割的最小单位 3:数据类型:原子数据类型:值不可分(整型,字符型,实型)和结构数据类型:值可分解(数组类型,结构类型)用户自己定义的 4:数据结构:逻辑结构,物理结构:存储结构(数据结构在计算机中的表示),运算特征. 逻辑结构:集合,线性结构(一对一),树型结构(一对多),图状结构(多对多) 运算:插入,删除,查找,排序. 数据结构定义:按某

龙舒净土文序

王龙舒居士著 龙舒净土文序 录印光大师代王弘愿阿阇黎作重刻龙舒土文题词并序 序 第一卷 净土起信 第二卷 净土总要 第三卷 普劝修持 第四卷 修持法门 第五卷 往生事迹 第六卷 特为劝论 第七卷 指迷归要 第八卷 现世感应 第九卷 助修上品 第十卷 净浊如一 龙舒增广净土文卷第十一 龙舒增广净土文卷第十二(附录) 丞相周益公赞 晋轩李居士赞 王龙舒国学传 王虚中传节录 龙舒净土文序 阿弥陀如来.以大愿力.摄受群品.系念甚简.证果甚速.或者疑之.余尝为之言.阿弥陀佛即汝性是.极乐国土即汝心是.众生

【抽象代数】 09 - 伽罗瓦理论

1. 正规扩域 在研究域\(F\)的代数扩张\(E\)时,首要的前提是扩域\(E\)是存在的,其次还要让所有扩域在同一个空间,即它们之间是可运算的.满足这样条件的空间便是\(F\)的代数闭包,使用集合论的语言,代数闭包可以描述成所有多项式的分裂域之并.这个定义合法性其实还是需要推敲的,你可以结合代数扩域的性质自行讨论,这里就先假定它的存在性.其次,不同的闭包之间并不一定是互通的,下面的讨论将回避这种“平行世界”的讨论,将范围限制在某个选定的代数闭包\(\Omega\)中. 即使只在某个闭包中,满

【信息学奥赛一本通 提高组】第二章 二分与三分

一.二分 二分法,在一个单调有序的集合或函数中查找一个解,每次分为左右两部分,判断解在那个部分并调整上下界,直到找到目标元素,每次二分都将舍弃一般的查找空间,因此效率很高. 二分常见模型 1.二分答案 最小值最大(或是最大值最小)问题,这类双最值问题常常选用二分法求解,也就是确定答案后,配合贪心,DP等其他算法检验这个答案是否合理,将最优化问题转化为判定性问题.例如,将长度为n的序列ai分为最多m个连续段,求所有分法中每段和的最大值的最小是多少? 2.二分查找 用具有单调性的布尔表达式求解分界点