【例1]给一个字符串(包含字母与数字),将字符串翻转【访问string的size与对象】
- 如给定“123asd222zxc”,反转后得到“123cxz222dsa”
class Solution { public: bool isLetter(char ch) { if(ch >= 'a' && ch <= 'z') return true; if(ch >= 'A' && ch <= 'Z') return true; return false; } string reverseOnlyLetters(string S) { if(S.empty()) return S; size_t begin = 0, end = S.size()-1; while(begin < end) { while(begin < end && !isLetter(S[begin])) ++begin; while(begin < end && !isLetter(S[end])) --end; swap(S[begin], S[end]); ++begin; --end; } return S; } }
【例2]验证一个字符串是否是回文【范围for遍历字符串】
class Solution { public: bool isLetterOrNumber(char ch)//是否是字母 { return (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'); } bool isPalindrome(string s) { for(auto& ch : s)//范围for,遍历字符串 { if(ch >= 'a' && ch <= 'z')// 先小写字母转换成大写,再进行判断 ch -= 32; } int begin = 0, end = s.size()-1; while(begin < end) { while(begin < end && !isLetterOrNumber(s[begin])) ++begin; while(begin < end && !isLetterOrNumber(s[end])) --end; if(s[begin] != s[end]) { return false; } else { ++begin; --end; } } return true; } };
【例3]找字符串中第一个只出现一次的字符【计数】
class Solution { public: int firstUniqChar(string s) { // 统计每个字符出现的次数 int count[256] = {0}; int size = s.size(); for(int i = 0; i < size; ++i) count[s[i]] += 1; // 按照字符次序从前往后找只出现一次的字符 for(int i = 0; i < size; ++i) if(1 == count[s[i]]) return i; return -1; } };
【例4]输入一个字符串,求字符串里面最后一个单词的长度【getline函数的应用】
- getline函数有两种不同的形式,这也就对应着字符串的 结束方式
- getline函数原型:getline(std::cin,string ch),表示以换行符 ‘\n’ 结束字符串的读入
- getline函数原型 getline(std::cin,string s,char ch),表示以字符ch来结束字符串的读入
- 功能: 无视空格,读取输入屏幕的字符串
#include<iostream> #include<string> using namespace std; int main() { string line; // 不要使用cin>>line,因为会它遇到空格就结束了 // while(cin>>line) while(getline(cin, line)) { size_t pos = line.rfind(' '); cout<<line.size()-pos-1<<endl; } return 0; }
【例5】将两个字符串相加(ASCALL码相加)【reverse函数,+=,insert】
- 题目如下所示:
- 两个字符串相加的规定是,ASCALL码值相加
- 开始前,我们要清楚明白,该题目需要遍历两个字符串
- 有两种思路: 从前往后相加,+=尾插以后再reverse过来(代码片所用方法) 或者从后往前相加,相加的结果到字符串可以使用insert头插
- 我们先考虑分别遍历一位的情况,后面要采用while循环
- (1)遍历字符串的同时,分别取数,将字符的ASCALL通过-“0”,转换成整型
- (2)取数完的同时分别相加,考虑进位
- (3)最后再+“0”,重新转换成字符,形成字符串
class Solution { public: string addstrings(string num1, string num2) { int end1 = num1.size()-1; int end2 = num2.size()-1; int value1 = 0, value2 = 0, next = 0;//核心设置: string addret;//形成的新串存放在其中 while(end1 >= 0 || end2 >= 0) { if(end1 >= 0) value1 = num1[end1--]-'0'; else value1 = 0; if(end2 >= 0) value2 = num2[end2--]-'0'; else value2 = 0; int valueret = value1 + value2 + next;//next为进位,value1,value2为单次循环中分别的取数 if(valueret > 9) { next = 1; valueret -= 10; } else { next = 0; } //addret.insert(addret.begin(), valueret+'0'); addret += (valueret+'0'); } // 从后往前相加,相加的结果到字符串可以使用insert头插 // 或者+=尾插以后再reverse过来 if(next == 1) { //addret.insert(addret.begin(), '1'); addret += '1'; } reverse(addret.begin(), addret.end()); return addret; } };