第一个只出现一次的字符位置
题目描述
在一个字符串(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();
是通不过编译的。
时间: 2024-10-09 21:10:38