剑指offer统计字符数组中第一次出现的字符

给定一个字符串,例如“abaccdeff”则第一次出现的字符就是b;

#include<iostream>
#include<string>
using namespace std;
void first(const string &input)
{
	if(input.empty())
		return ;
	string::size_type length=input.size();
	int *times=new int[length];
	for(int i=0;i<length;++i)
		times[i]=0;
	string temp;
	int index=0;
	for(int j=0;j<length;++j)
	{
		string::size_type pos=0;
		char  key=input[j];
		pos=temp.find(key);
		if(pos==string::npos)
		{
			temp.push_back(key);
			times[index]++;
			index++;
		}
		else
		{
			times[pos]++;
		}

	}
	for(int i=0;i<temp.size();++i)
	{
		if(times[i]==1)
		{
			cout<<"the first char is"<<temp[i]<<endl;
			return ;
		}
	}
}
int main()
{
	string input("abaccdeff");
	first(input);
	system("pause");
	return 0;
}
时间: 2024-10-11 17:57:36

剑指offer统计字符数组中第一次出现的字符的相关文章

【剑指offer】旋转数组中的最小值

题目总结: 1.若没有进行旋转,或者说旋转后的效果跟没有旋转是一样的,那么index1指示的值小于index2指示的值,返回index1的值. 2.若是一般性的旋转,那么最小的值旋转后肯定在中间,那么我们就可以从两边向中间夹逼. 3.夹逼的过程中,若 [ index1, middle ] 是有序的,说明这部分子区间没被破坏,旋转所移动的元素都在middle 的后面,那么最小值可定也在后面的部分,令 index1 = middle,继续向后夹逼:同理,若 [ middle ,index2 ] 是有

剑指Offer对答如流系列 - 数组中数字出现的次数

面试题56:数组中数字出现的次数 题目描述 问题(1)数组中只出现一次的两个数字 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 问题(2)数组中唯一只出现一次的数字 在一个数组中除了一个数字只出现一次之外,其他数字都出现了三次.请找出那个只出现一次的数字. 问题分析 问题(1)分析 在这篇文章剑指Offer对答如流系列 - 二进制中 1 的个数中,我们详细探讨了位运算,其中有重要的一条:两个相同的数异

剑指offer系列——35.数组中的逆序对??

Q:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000000007 输入描述: 题目保证输入的数组中没有的相同的数字 数据范围: 对于%50的数据,size<=10^4 对于%75的数据,size<=10^5 对于%100的数据,size<=2*10^5 示例1 输入: 1,2,3,4,5,6,7,0 输出: 7 T:引用:https://blog.

[剑指Offer]53-在排序数组中查找数字(二分查找)

题目一 数字在排序数组中出现的个数 题目描述 统计一个数字在排序数组中出现的次数. 解决思路 写两个二分查找分别找第一个和最后一个该数字,然后可直接出计算有几个该数字.时间复杂度为O(logn). 这里使用二分查找的递归写法,形式可以写得更简洁(见书). 当输入不符合规则返回-1.注意形参len表示原始数组的长度,在此题目中是必要的.注意特殊输入的处理. 代码 #include <iostream> using namespace std; int findFirstK(int* num,in

剑指Offer对答如流系列 - 数组中的逆序对

面试题51:数组中的逆序对 题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 问题分析 大多数人的第一反应就是顺序扫描整个数组,对每个数字都和后面的数字比较大小,时间复杂度为O(n^2),效率太低. 利用归并排序的思想,先将数组分解成为n个长度为1的子数组,然后进行两两合并同时排好顺序.(在排序的时候计算逆序对) 归并排序是经典排序算法之一,其核心是将待排数组不断细分,然后排序最后再合并,这是经典的分治策略(分

剑指offer之【数组中重复的数字】

题目: 数组中重复的数字 链接: https://www.nowcoder.com/practice/623a5ac0ea5b4e5f95552655361ae0a8?tpId=13&tqId=11203&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述: 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不

《剑指offer》:[51]数组中的重复数字

题目:在一个长度为n的数组里所有数字都在0到n-1的范围里.数组中某些数字是重复的,但是不知道有几个数字重复了,也不知道每个数字重复几次.请找出数组中任意一个重复的数字.例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3. 分析:其实这个题因为它的限制太多,这样是这个题失去了泛型,比如里面的数字的范围确定在0到n-1内,还有任意意对即可,不能对任意的数组进行查重操作.下面先来看看这个问题怎么解决吧! 方案一:时间复杂度为O(N*N)的顺序扫描法.从第一

剑指Offer——在特殊数组中查找某数

问题:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断该数组中是否含有该整数.比如:在如下二维数组中查找是否有7,若存在,则返回true,否则,返回false. 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 此时,也许我们第一时间看到这个问题会很兴奋,想当然的觉得,如此简单的问题,何必在此浪费时间,不就是进行一次遍历数组嘛..但是再细细的想一想,面试官也不是等闲之辈,不会拿

剑指offer—二维数组中找数

题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 基本思想: 首先选取数组中右上角的数字.如果=要找的数字,结束.如果大于要找的数字,剔除这个数字所在的列:如果小于要找的数字,剔除这个数字所在的行. #include <iostream> using namespace std; void find(int a[][4],int rows,int columns,int