题目描述:
2211. 统计道路上的碰撞次数 - 力扣(LeetCode)
大致思路:
一种情况是全是左或者全是右,这种的不会撞到,直接返回00
另一种是,在最左端不是向左,最右端不是向右的基础上,只要这两个端点内不是静止的,都会相撞。因此只要获得这一段,再用字符串长度-“S”的数量就是碰撞次数。
class Solution {
public:
int countCollisions(string directions) {
// 去除前导L
size_t start = directions.find_first_not_of('L');
if (start == string::npos) return 0; // 如果全是L,则没有碰撞
directions = directions.substr(start);
// 去除后缀R
size_t end = directions.find_last_not_of('R');
if (end == string::npos) return 0; // 如果全是R,也没有碰撞
directions = directions.substr(0, end + 1);
// 计算剩下非停止的车的数量,这些车必然会发生碰撞
int collisions = directions.length() - count(directions.begin(), directions.end(), 'S');
return collisions;
}
};
`size_t` 是 C++ 中的一种无符号整数类型,它用于表示大小,如数组的尺寸、容器的大小或是任何其他需要表示长度、容量等的概念。它是与机器无关的,意味着无论在32位还是64位系统上,只要能保证足够大以容纳最大可能的尺寸即可。`size_t` 的具体定义通常位于头文件 `cstddef` 中,并且它的实际类型(如 `unsigned int` 或 `unsigned long`)依据编译器和平台的不同而有所差异。
在使用内存、容器、数组或其他需要计数的地方,使用 `size_t` 类型可以确保计数永远不会为负,并且足够大以覆盖所有可能的合法尺寸。这有助于提升代码的可移植性和安全性。例如,在遍历数组时,循环计数器使用 `size_t` 类型可以避免无意识地与负数相关的错误。
find_first_not_of
是 C++ 标准库中 std::basic_string
类(例如 std::string
对于字符序列)的一个成员函数,用于查找字符串中第一个不匹配指定字符集中的任何字符的位置。
如果未找到这样的字符,则返回std::string::npos
substr()
是 C++ 标准库中 std::string
类的一个成员函数,用于从给定的字符串 s
中提取一个子字符串。这个函数可以根据起始位置和可选的长度参数来创建一个新的字符串,该新字符串包含原始字符串中指定范围内的字符。
1std::string substr(size_type pos = 0, size_type count = npos) const;
pos
:必需,指定子字符串开始提取的位置索引,默认为0,即字符串的起始位置。count
:可选,指定要提取的字符数量,默认为npos
,意味着从pos
开始直到字符串结束的所有字符。
所以第一次direction被剪成了从start(从第一个不是L)开始到末尾的字符串,而第二次剪的时候,从0开始,此时的0也就是start的位置。
count目测是寻找头尾迭代器之间的const char a出现的个数,length()应该是返回一个字符串的长度。