练习题
仅仅反转字母
917. 仅仅反转字母 - 力扣(LeetCode)
题目
给你一个字符串 s
,根据下述规则反转字符串:
- 所有非英文字母保留在原有位置。
- 所有英文字母(小写或大写)位置反转。
返回反转后的 s
。
示例 1:
输入:s = "ab-cd" 输出:"dc-ba"
示例 2:
输入:s = "a-bC-dEf-ghIj" 输出:"j-Ih-gfE-dCba"
示例 3:
输入:s = "Test1ng-Leet=code-Q!" 输出:"Qedo1ct-eeLg=ntse-T!"
提示
1 <= s.length <= 100
s
仅由 ASCII 值在范围[33, 122]
的字符组成s
不含'\"'
或'\\'
解题代码
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;
}
};
字符串中的第一个唯一字符
387. 字符串中的第一个唯一字符 - 力扣(LeetCode)
题目
给定一个字符串 s
,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1
。
示例 1:
输入: s = "leetcode" 输出: 0
示例 2:
输入: s = "loveleetcode" 输出: 2
示例 3:
输入: s = "aabb" 输出: -1
提示:
1 <= s.length <= 105
s
只包含小写字母
解题代码
class Solution {
public:
int firstUniqChar(string s) {
// 统计每个字符出现的次数
int count[26] = { 0 };
for (auto ch : s)
{
count[ch - 'a']++;
}
for (size_t i = 0; i < s.size(); ++i)
{
if(count[s[i] - 'a'] == 1)
return i;
}
return -1;
}
};
字符串相加
415. 字符串相加 - 力扣(LeetCode)
题目
给定两个字符串形式的非负整数 num1
和num2
,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger
), 也不能直接将输入的字符串转换为整数形式。
示例 1:
输入:num1 = "11", num2 = "123" 输出:"134"
示例 2:
输入:num1 = "456", num2 = "77" 输出:"533"
示例 3:
输入:num1 = "0", num2 = "0" 输出:"0"
提示:
1 <= num1.length, num2.length <= 104
num1
和num2
都只包含数字0-9
num1
和num2
都不包含任何前导零
解题思路
直接创建一个两个字符串最大长度加一个空间
创建两个函数分别指向两个字符串的最后一个字符
创建字符串接收结果
创建一个函数用来存储进位
如果end1、end2位置字符大于等于0,那么就减字符0把它变成整型值,前挪减减,如果字符串没有了那么给0
创建ret存储两个加的结果再加进位next
进位next就储存ret除10所得的数
个位:ret磨10的结果 如:13磨10得3,3就是个位
字符串+=接收ret+字符0的数
出了循环只剩next为1,那么str接收的值就为1 如:3+7=10,next就为1,ret为0,不加的话就返回0,加它之后就结果为10
由于是尾插所以数是反的,那么调用reverse头尾交换
最后返回str
解题代码
class Solution {
public:
string addStrings(string num1, string num2) {
int end1=num1.size()-1,end2=num2.size()-1;
string str;
int next=0;
while(end1>=0 || end2>=0)
{
int x1 = end1 >= 0 ?num1[end1--]-'0' :0;
int x2 = end2 >= 0 ?num2[end2--]-'0' :0;
int ret= x1+x2+next;
next = ret/10;
ret = ret%10;
str+=('0'+ret);
}
if(next==1)
str+='1';
reverse(str.begin(),str.end());
return str;
}
};
字符串最后一个单词的长度
字符串最后一个单词的长度_牛客题霸_牛客网
题目
描述
对于给定的若干个单词组成的句子,每个单词均由大小写字母混合构成,单词间使用单个空格分隔。输出最后一个单词的长度。
输入描述:
在一行上输入若干个字符串,每个字符串代表一个单词,组成给定的句子。
除此之外,保证每个单词非空,由大小写字母混合构成,且总字符长度不超过 103103 。
输出描述:
在一行上输出一个整数,代表最后一个单词的长度。
示例1
输入:
HelloNowcoder
输出:
13
说明:
在这个样例中,最后一个单词是 "HelloNowcoder""HelloNowcoder" ,长度为 1313 。
示例2
输入:
A B C D
输出:
1
解题代码
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str;
// 不要使用cin>>line,因为会它遇到空格就结束了
// while(cin>>line)
getline(cin, str);
size_t pos = str.rfind(' ');
cout << str.size() - (pos + 1) << endl;
return 0;
}
验证一个字符串是否是回文
125. 验证回文串 - 力扣(LeetCode)
题目
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 s
,如果它是 回文串 ,返回 true
;否则,返回 false
。
示例 1:
输入: s = "A man, a plan, a canal: Panama" 输出:true 解释:"amanaplanacanalpanama" 是回文串。
示例 2:
输入:s = "race a car" 输出:false 解释:"raceacar" 不是回文串。
示例 3:
输入:s = " " 输出:true 解释:在移除非字母数字字符之后,s 是一个空字符串 "" 。 由于空字符串正着反着读都一样,所以是回文串。
提示:
1 <= s.length <= 2 * 105
s
仅由可打印的 ASCII 字符组成
解题代码
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)
{
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;
}
};