码迷,mamicode.com
首页 > 其他好文 > 详细

31.第一个只出现一次的字符位置

时间:2016-05-12 16:08:25      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:

第一个只出现一次的字符位置

题目描述

在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符的位置。若为空串,返回-1。位置索引从0开始
虽说C++的string类用起来超爽,但是和平时的使用习惯不同,我更喜欢原滋原味的C风格字符。这道题我写了两个版本,一个是C++风格的string,另一个是C风格字符串。
注意,C风格字符串中判断是否到达字符串末尾的两种方法:
*p != '\0'
*p != 0
本质上是一回事。
string版:
#include "stdafx.h"
#include <string>
#include<iostream>
using namespace::std;
class Solution {
public:
	int FirstNotRepeatingChar(string str) {
		if (str.empty()) return -1;

		int arr[256] = { 0 };
		int length = str.length();
		for (int i = 0; i < length; i++){
			arr[(int)str[i]]++;
			std::cout << (int)str[i] << endl;
		}
		int retVal = 0;
		for (int i = 0; i < length; i++){
			if (arr[(int)str[i]] == 1)
				break;
			retVal++;
		}
		if (retVal == str.length()){
			retVal = -1;
		}
		return retVal;
	}
};
int _tmain(int argc, _TCHAR* argv[])
{
	Solution s;
	string test = "asdfasdfe";
	int result = s.FirstNotRepeatingChar(test);
	return 0;
}

C风格字符串版:
#include "stdafx.h"
#include <string>
#include<iostream>
using namespace::std;
class Solution {
public:
	int FirstNotRepeatingChar(string str) {
		if (str.empty()) return -1;

		const char* p = str.data();
		int strLength = 0;
		int arr[256] = { 0 };
		while (*p != '\0'){
			arr[*p]++;
			p++;
			strLength++;
		}
		const char* p2 = str.c_str();
		int retVal = 0;
		while (*p2 != '\0'){
			if (arr[*p2] == 1)
				break;
			p2++; retVal++;
		}
		if (retVal == strLength){
			retVal = -1;
		}
		return retVal;
	}
};
int _tmain(int argc, _TCHAR* argv[])
{
	Solution s;
	string test = "asdfasdfe";
	int result = s.FirstNotRepeatingChar(test);
	return 0;
}
说说这里面的坑:
string有两个函数可以转C风格字符串,一个是c_str(),另一个是data(),效果似乎相同,都会在字符串结尾补上‘\0‘,关键是两个函数的返回值都是const char*指针
const char* p = str.data();
写成
char* p = str.data();
是通不过编译的。

31.第一个只出现一次的字符位置

标签:

原文地址:http://blog.csdn.net/chengonghao/article/details/51366020

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!