文章目录
C/C++刷算法题时字符串处理技巧
字符串中内容都变为小写
C++函数自带tolower('H')
也可以自己实现函数来实现
#include <iostream>
using namespace std;
char to_lower(char c)
{
if (c >= 'A' && c <= 'Z')
{
c = c + ('a' - 'A');//小写和大写相差32,因此大写加上32可以变为小写
}
return c;
}
int main()
{
string s = "Hello World";
for (auto &c : s)
{
c = to_lower(c);
}
cout << s << endl;
cout << (char)tolower('A') << endl;
return 0;
}
其他数据类型转变为字符串
to_string()
int c = 10;
string num = to_string(c);
cout << num << endl;
字符数字如何转换为int数字
减去一个相对值'0'
int num='4'-'0';//返回4
如何判断两个时间哪个更小
对于相同位数的HH:MM:SS
格式的字符串时间,因为是从前往后比较,比较字典序即可,C++中,字符串可以直接用>
和<
号比大小
判断某元素是否在某集合中出现过
#include <iostream>
#include <unordered_set>
using namespace std;
string s1, s2;
int main()
{
getline(cin, s1);
getline(cin, s2);
unordered_set<char> hash; // 定义哈希表
for (auto c : s2) hash.insert(c); // 将s2中的字符插入哈希表
string res;
for (auto c : s1)
if (!hash.count(c))//hash.count(c)统计元素出现的次数,如果为0,则是没有出现过
res += c;
cout << res << endl;
return 0;
}
从一行句子中提取单词
双指针
#include <iostream>
#include <unordered_map>
using namespace std;
bool check(char c)
{
if (c >= '0' && c <= '9') return true;
if (c >= 'A' && c <= 'Z') return true;
if (c >= 'a' && c <= 'z') return true;
return false;
}
int main()
{
string str;
getline(cin, str);
unordered_map<string, int> hash;
for (int i = 0; i < str.size(); i ++ )
if (check(str[i]))
{
string word;
int j = i;
while (j < str.size() && check(str[j])) word += tolower(str[j ++ ]);
hash[word] ++ ;//word是抠出来的单词,hash[word]++是指这个单词对应的个数+1
i = j;
}
string word;
int cnt = -1;
for (auto item : hash)
//item.first是字符串,item.second是次数
if (item.second > cnt || item.second == cnt && item.first < word)
{
word = item.first;
cnt = item.second;
}
cout << word << ' ' << cnt << endl;
return 0;
}
格式化输出填充补齐
在C语言中,如果你想要在输出时对不足两位的数字进行填充(比如用0
或*
补足到两位),可以使用printf
函数的格式化输出能力来实现这一点。printf
允许你指定输出格式,包括输出宽度和填充字符。然而,标准的printf
函数并不直接支持使用非空格以外的字符进行填充。因此,要实现使用特定字符填充,需要一些额外的步骤。
C语言使用0
填充
如果你想用0
来填充,可以直接在格式说明符中指定宽度和0
标志。例如,要确保输出总是两位数,可以这样做:
int num = 5;
printf("%02d\n", num); // 输出:05
C语言使用*
或其他字符填充
对于使用*
或其他非0
字符进行填充的情况,C语言的标准printf
功能不提供直接支持。一种解决方法是手动检查数值的位数,如果不足两位,则先输出填充字符,再输出数值本身。例如:
int num = 5;
if (num < 10) {
printf("*%d\n", num); // 输出:*5
} else {
printf("%d\n", num);
}
对于更通用的情况,如果你有多个不同的数值要按这种方式格式化输出,你可能需要写一个函数来封装这个逻辑,以便复用:
#include <stdio.h>
void printWithPadding(int num, char paddingChar) {
if (num < 10) {
printf("%c%d\n", paddingChar, num);
} else {
printf("%d\n", num);
}
}
int main() {
printWithPadding(5, '*'); // 输出:*5
printWithPadding(12, '*'); // 输出:12
return 0;
}
在C++中,处理不足两位补0
或补*
等特定字符,可以通过使用标准库中的iostream
和iomanip
来实现。对于补0
,C++提供了直接的方式,而对于补其他非标准填充字符(如*
),可能需要一些额外的处理。
C++使用0
填充
使用0
填充到两位数可以直接使用std::setw
和std::setfill
,其中std::setw
设置宽度,std::setfill
设置填充字符(默认情况下填充空格,但当与0
一起使用时可以直接达到填充0
的效果)。例如:
#include <iostream>
#include <iomanip>
int main() {
int num = 5;
std::cout << std::setw(2) << std::setfill('0') << num << std::endl; // 输出:05
return 0;
}
C++使用*
或其他字符填充
对于使用*
或其他非0
字符进行填充,由于std::cout
默认不支持在数值类型左侧填充其他字符,你可能需要先判断数值的位数,然后手动处理。例如:
#include <iostream>
#include <iomanip>
#include <sstream> // For std::stringstream
void printWithPadding(int num, char paddingChar) {
if (num < 10) {
std::cout << paddingChar << num << std::endl; // 手动填充
} else {
std::cout << num << std::endl; // 不需要填充
}
}
int main() {
printWithPadding(5, '*'); // 输出:*5
printWithPadding(12, '*'); // 输出:12
return 0;
}
在这个例子中,我们为数字手动添加了填充字符。这种方法提供了灵活性,允许你使用任何字符作为填充,并且可以适应不同的输出需求。
请注意,std::setw
和std::setfill
对后续的输出操作也会产生影响,直到下一次设置或输出流结束。如果你希望影响范围仅限于单次输出,可能需要在每次输出前都设置一次。
在C++中,当你使用std::setw
和std::setfill
对std::cout
进行设置后,这些设置仅对随后的立即输出有效一次。这意味着每次输出之后,宽度(setw
)会被重置为零,但填充字符(setfill
)会保持之前的设置直到你显式地更改它。
如果你想要在使用std::setw
和std::setfill
进行特定格式化输出之后恢复到默认的输出状态,对于宽度不需要做任何操作,因为它会自动重置。对于填充字符,如果你想恢复到默认的空格填充,你需要再次使用std::setfill
将其设置回空格字符。这里是如何做的:
#include <iostream>
#include <iomanip>
int main() {
int num = 5;
// 使用特定的填充字符和宽度进行输出
std::cout << std::setw(2) << std::setfill('0') << num << std::endl;
// 恢复默认的填充字符(空格)
std::cout << std::setfill(' ');
// 之后的输出将使用默认的填充字符和宽度
std::cout << std::setw(2) << 42 << std::endl; // 注意:setw 需要对每个想要特定宽度的输出重新设置
return 0;
}
请注意,由于std::setw
的设置仅对紧随其后的输出操作有效一次,所以如果你想要对多个项应用特定的宽度,你需要为每个输出项重新设置std::setw
。而std::setfill
的设置则会一直保持,直到你显式地更改它。因此,在需要恢复默认设置时,只需要将填充字符通过std::setfill(' ')
设置回空格即可。
给出起始分钟数和截止分钟数,算出这段时间内每个时间段的花费(前缀和,用于快速计算区间和)
预处理出起始时刻,到这段时间内任意分钟所花费的钱
想要知道某一时间段的钱,做减法即可
格式化字符数组/字符串
char name[50], state[10], format_time[20];
int month, day, hour, minute;
sprintf(format_time, "%02d:%02d:%02d", day, hour, minute); // 格式化字符串