C/C++刷算法题时字符串处理技巧

本文详细介绍了C/C++编程中处理字符串的技巧,如小写转换、数据类型转换、时间比较、元素查找、单词提取、格式化输出以及使用前缀和计算区间和。还探讨了如何使用特定字符填充数字和字符数组的格式化问题。
摘要由CSDN通过智能技术生成


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或补*等特定字符,可以通过使用标准库中的iostreamiomanip来实现。对于补0,C++提供了直接的方式,而对于补其他非标准填充字符(如*),可能需要一些额外的处理。

C++使用0填充

使用0填充到两位数可以直接使用std::setwstd::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::setwstd::setfill对后续的输出操作也会产生影响,直到下一次设置或输出流结束。如果你希望影响范围仅限于单次输出,可能需要在每次输出前都设置一次。

在C++中,当你使用std::setwstd::setfillstd::cout进行设置后,这些设置仅对随后的立即输出有效一次。这意味着每次输出之后,宽度(setw)会被重置为零,但填充字符(setfill)会保持之前的设置直到你显式地更改它。

如果你想要在使用std::setwstd::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); // 格式化字符串
  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值