// 013.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
//思路:字符的ASCI码值从0到255,设立一个数组用于记录每一个值出现的次数。
//此数组的最大控件为256,则可以统计出每个ASCI值出现的次数。
//出现次数为1次的字符被筛选出来,在字符缓冲区中提取其对应的下标。找出
//下标最小的同时只出现一次的字符。
bool FindFirstDisplayCharacter(char *pBuffer, int &minPos)
{
if (NULL == pBuffer)
{
return false;
}
int len=0;
char *pBegin = pBuffer;
while(*pBegin != '\0')
{
len++;
pBegin++;
}
const int MAX_SIZE = 256;
int timesofCharacter[MAX_SIZE];
int i=0;
for (i=0; i<MAX_SIZE; i++)
{
timesofCharacter[i] = 0;
}
for (i=0; i<len; i++)
{
int index = pBuffer[i];
for (int j=0; j<MAX_SIZE; j++)
{
if (j == index)
{
++timesofCharacter[index];
}
}
}
//出现一次的字符有:
int count = 0;
char pTemp[MAX_SIZE];//保存出现一次的字符
for (i=0; i<MAX_SIZE; i++)
{
if (timesofCharacter[i] == 1)
{
pTemp[count] = i;
count++;
}
}
bool bFirst = true;
int pos = 0;
for (int j=0; j<count; j++)
{
for (i=0; i<len; i++)
{
if (pTemp[j] == pBuffer[i])
{
if (bFirst)//第一次出现相等字符时
{
bFirst = false;
pos = i;
}
else
{
if (i < pos)
{
pos = i;//记录最小位置
}
}
}
}
}
minPos = pos;
return true;
}
//改进版本
char FindFirstChar(char *pBuf)
{
if (NULL == pBuf)
{
return 0;
}
const int MAX_SIZE = 256;
int timesofCharacter[MAX_SIZE];
int i = 0;
for (i=0; i<MAX_SIZE; i++)
{
timesofCharacter[i] = 0;
}
char *pCur = pBuf;
while (*pCur != '\0')
{
timesofCharacter[*pCur]++;
pCur++;
}
pCur = pBuf;
while(*pCur != '\0')
{
if (timesofCharacter[*pCur] == 1)
{
return *pCur;
}
pCur++;
}
return 0;
}
//(13)-第一个只出现一次的字符
int main(int argc, char* argv[])
{
char pBuffer[] = "abbaccdeff";
/* int minPos = -1;
FindFirstDisplayCharacter(pBuffer, minPos);
char tmp = pBuffer[minPos];
*/
char tmp = FindFirstChar(pBuffer);
printf("%c\n", tmp);
return 0;
}
013-字符串
最新推荐文章于 2025-08-29 08:55:36 发布