- 零、导言
- 一、题目描述
- 二、题目分析
- 三、代码实现
- 四、总结回顾一下字符串 `string` 常用的知识
- 1、初始化方法
- 2、字符串增删改查
- 3、字符串比较
- 4、字符串中一些常用的字符判断
- 5、数字字符串和数之间的转换
每天根据每日一题的内容回顾 C/C++ 的语法和一些实用刷题知识。 texttt{每天根据每日一题的内容回顾 C/C++ 的语法和一些实用刷题知识。} 每天根据每日一题的内容回顾 C/C++ 的语法和一些实用刷题知识。
一、题目描述944、删列造序
给你由 n 个小写字母字符串组成的数组 strs,其中每个字符串长度相等。
这些字符串可以每个一行,排成一个网格。例如,strs = ["abc", "bce", "cae"] 可以排列为:
abc bce cae
你需要找出并删除 不是按字典序升序排列的 列。在上面的例子(下标从 0 开始)中,列 0('a', 'b', 'c')和列 2('c', 'e', 'e')都是按升序排列的,而列 1('b', 'c', 'a')不是,所以要删除列 1 。
返回你需要删除的列数。
二、题目分析示例:
输入: strs = ["cba","daf","ghi"] texttt{strs = ["cba","daf","ghi"]} strs = ["cba","daf","ghi"]
输出: 1 texttt{1} 1
解释:网格示意如下:
cba daf ghi texttt{cba daf ghi} cba daf ghi
列 0 texttt{0} 0 和列 2 texttt{2} 2 按升序排列,但列 1 texttt{1} 1 不是,所以只需要删除列 1 texttt{1} 1 。
(1)简单题加上数据量很小直接遍历就好,遍历每个字符串的对应位置,判断是否 按字典序排列的 就可以了。
(2)简单题一般遍历枚举都可以了,就像是周赛的一二题,直接遍历枚举基本上就可以通过了。
class Solution {
public:
int minDeletionSize(vector& strs) {
int cnt = 0;
int i, j;
int n = strs.size();
int m = strs[0].size();
for(i = 0; i < m; ++i){
for(j = 1; j < n; ++j){
if(strs[j-1][i] > strs[j][i]){
++cnt;
break;
}
}
}
return cnt;
}
};
四、总结回顾一下字符串 string 常用的知识
这里总结的一些用法是刷题到目前为止的比较常用的用法。关于 string texttt{string} string 字符串的用法实在是太多了,还有 C++11 texttt{C++11} C++11 中的一些新的用法。后续用到了再继续更新!
1、初始化方法C++里面的 string 是可以作为容器存在的,自然就支持一些类似 vector<> 容器的操作;可以回顾一下这篇题解中 vector<>容器的一些初始化操作,string 容器有着类似的初始化方法;
2、字符串增删改查// 增删改查 #include3、字符串比较#include // 头文件一定不要忘记添加 int main(){ return 0; }
通常会看到这样的比较表达式 str1 > str2 这是什么意思呢?表示的是这两个字符串之间进行 字典序比较 ,符合字典序输出为 true ,否则输出为 false;
4、字符串中一些常用的字符判断熟练掌握这个 C++11 中标准的库函数,可以快速完成编程。但是对于初学者来说建议多想想这些是怎么实现的,熟练之后再直接使用库函数。
| 用法 | 解释 |
|---|---|
| isspace() texttt{isspace()} isspace() | 判断当前字符是否是空格,是输出为true,否则输出为false |
| isdigit() texttt{isdigit()} isdigit() | 判断当前字符是否是数字 |
| isalpha() texttt{isalpha()} isalpha() | 判断当前字符是否是字母 |
| islower() texttt{islower()} islower() | 判断当前字符是否是小写字母 |
| isupper() texttt{isupper()} isupper() | 判断当前字符是否是大写字母 |
| tolower() texttt{tolower()} tolower() | 将当前字符转化为小写字母 |
| toupper() texttt{toupper()} toupper() | 将当前字符转化为大写字母 |
有时候在一些算法题当中,先对数字进行字符串化,再进行进一步操作会很方便。比如给定一个num 判断它是不是 回文数 ,我们就可以先将它转化为字符串,再用 双指针 判断是否是回文数。肯定也会有其他方法来实现,只是先字符串化再判断,我们比较熟悉而已。
// 字符串和数字之间如何相互转换?
1、库函数
std::to_string() // 将数字常量转换为字符串
// C++的字符处理函数,都是将字符串转化为 int 输出,形参列表不同
std::atoi() // 形参是 const *char
// 对于一个 string 类型的字符串要调用c_str()转化为 char 类型才能作为 atoi 的实参
std::stoi() // 型参是 const *string
2、atoi()与stoi()使用注意
①、atoi()不会做范围检查,超出上限则输出上界,超出下限输出下界
②、stoi()会做范围检查,默认范围是在 int 范围内,超出范围会报错 runtime error!
3、函数实现(字符串流的方式)
#include // 包含的头文件
#include
int str2Int(string s){
int ret;
stringstream ss;
ss << s;
ss >> ret;
return ret;
}
// 字符串流的方法
#include // 包含的头文件
#include
string int2Str(int val){
string ret;
stringstream ss;
ss << val;
ret = ss.str();
return ret;
}
4、也可以通过借助 vector 容器的方式,实现数字字符串与数字之间的转换



