力扣刷题Day1
来源:锐游网
题目:
给你一个字符串 s
,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。
单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。
示例 1:
输入:s = "Hello World" 输出:5 解释:最后一个单词是“World”,长度为 5。
示例 2:
输入:s = " fly me to the moon " 输出:4 解释:最后一个单词是“moon”,长度为 4。
示例 3:
输入:s = "luffy is still joyboy" 输出:6 解释:最后一个单词是长度为 6 的“joyboy”。
提示:
1 <= s.length <= 104
s
仅有英文字母和空格' '
组成s
中至少存在一个单词
解析:
定义string s,s.size()为整个字符串的长度,则s.size()-1则为字符串最后一个字母的索引
string s = Hello;
H e l l o
0 1 2 3 4
s.size() = 5 //字符串长度为5
s.size()-1 = 4 //对应字符串最后一个字母的索引'o'为4
代码:
#include <iostream>
#include<string>
using namespace std;
class Solution{
public:
int lengthOfLastWord(string s) {
int index = s.size()-1; //设置字符串最后一个字母对应的索引
while (s[index] == ' ')
{
index--;
} //针对示例2,去除字符串末尾空格的影响,让索引-1,直到找到字母
int wordLength = 0; //初始化单词长度为0
while (index >= 0 && s[index] != ' ')
{
wordLength++;
index--;
} //反向遍历
return wordLength; //返回单词长度的大小
}
};
int main()
{
string s;
cin>>s;
Solution sol;
cout<<sol.lengthOfLastWord(s);
return 0;
}
题目:
给你一个字符串 s
,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。
示例 1:
输入:s = "Hello" 输出:"hello"
示例 2:
输入:s = "here" 输出:"here"
示例 3:
输入:s = "LOVELY" 输出:"lovely"
提示:
1 <= s.length <= 100
s
由 ASCII 字符集中的可打印字符组成
解析:
for循环的应用:
for (元素类型& 元素变量 : 容器)
{
// 循环体
}
如:string s;
for(char& ch : s)
{
……
}
代码1:ASCII码方法
#include <iostream>
#include<string>
using namespace std;
class Solution {
public:
string toLowerCase(string s) {
for(char& ch : s)
{
if(ch >= 65 && ch <= 90)
{
ch +=32; //这里也可以写成ch |=32; 用一个或运算
} //A~Z:[65,90];a~z:[97,122]
}
return s;
}
};
int main()
{
string s;
cin >> s;
Solution sol;
cout<<sol.toLowerCase(s);
return 0;
}
代码2:使用语言 API
#include <iostream>
#include<string>
using namespace std;
class Solution
{
public:
string toLowerCase(string s)
{
for (char& ch: s)
{
ch = tolower(ch);
}
return s;
}
};
int main()
{
string s;
cin >> s;
Solution sol;
cout<<sol.toLowerCase(s);
return 0;
}
题目:
给你两个字符串 word1
和 word2
。请你从 word1
开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。
返回 合并后的字符串 。
示例 1:
输入:word1 = "abc", word2 = "pqr" 输出:"apbqcr" 解释:字符串合并情况如下所示: word1: a b c word2: p q r 合并后: a p b q c r
示例 2:
输入:word1 = "ab", word2 = "pqrs" 输出:"apbqrs" 解释:注意,word2 比 word1 长,"rs" 需要追加到合并后字符串的末尾。 word1: a b word2: p q r s 合并后: a p b q r s
示例 3:
输入:word1 = "abcd", word2 = "pq" 输出:"apbqcd" 解释:注意,word1 比 word2 长,"cd" 需要追加到合并后字符串的末尾。 word1: a b c d word2: p q 合并后: a p b q c d
提示:
1 <= word1.length, word2.length <= 100
word1
和word2
由小写英文字母组成
解析:
使用双指针,
使用两个指针 i 和 j,初始时分别指向两个字符串的首个位置。随后的每次循环中,依次进行如下的两步操作:
- 如果 i 没有超出 word1的范围(就是把word1里所有的字母遍历一遍),就将word1[i]加入ans,并且将 i+1;
- 如果 j 没有超出 word2的范围,就将 word2[j] 加入ans,并且将 j+1。
当 i 和 j 都超出对应的范围后,结束循环并返回答案即可。
代码:
#include <iostream>
#include<string>
using namespace std;
class Solution {
public:
string mergeAlternately(string word1, string word2)
{
int m = word1.size(); //设置m为word1的单词长度
int n = word2.size(); //设置n为word2的单词长度
int i=0, j=0;
string ans;
ans.reserve(m+n); //预留出m+n的空间
while(i < m || j < n)
//i没有超出m(word1的范围),j没有超出n(word2的范围)
{
if(i < m)
{
ans.push_back(word1[i]); //添加i位置的字母
++i;
}
if(j < n)
{
ans.push_back(word2[j]); //添加j位置的字母
++j;
}
}
return ans;
}
};
int main()
{
string w1, w2;
cin >> w1 >> w2;
Solution sol;
cout<<sol.mergeAlternately(w1, w2);
return 0;
}
因篇幅问题不能全部显示,请点此查看更多更全内容