本篇文章使用的编程语言:c++
题目复现
问题描述
小M有一个只包含 '0' 和 '1' 的字符串,她想知道有多少个子串是“好串”。一个子串如果是好串,那么它的所有前缀中,'0' 的数量严格大于 '1' 的数量。
测试样例
样例1:
输入:
t = "100"
输出:3
样例2:
输入:
t = "10010"
输出:6
样例3:
输入:
t = "010101"
输出:3
相关知识点解析
1、Staticcast强制类型转换
这种强制的类型转换其实源自于在c语言中对于代码进行相关的类型转换和对应的代码的转述
其实在c++的语言书写和编程的过程当中对于类型进行转换操作,从而符合题目以及对应的代码的要求
但是实际上,代码的类型转换有四种常用的类型,分别为:static_cast、reinterpret_cast、const_cast 和 dynamic_cast,这四种类型的转换分别所实现的操作为:从派生类到基类的转换、对于指针的重新解释并转换、移除对象的const或volatile限定符的类型、处理多态性的类型转换运算符,而在本题上所应用到的为第一个类型转换,故不再赘述。
而对于static_cast方法则是先在前面定义对应的类型(需要转换的类型)然后再在后面定义一个需要转换的变量,那么就回进行对应的四舍五入以及对应的化简从而达到对应的类型转换的效果。
2、string中的.length方法
而这个方法实际上就是对于一个字符串返回对应的字符串长度,避免二次循环和调用,从而保证对应的存储空间得到节省
3、关于long long类型
long long 是 C++ 中的一种整数类型,它被定义为至少 64 位的有符号整数。这意味着 long long 类型可以用来存储非常大的整数值,其取值范围从 -2^63 到 2^63-1(即 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807)。与之相对应的是无符号版本 unsigned long long,它的取值范围是从 0 到 2^64-1(即 0 到 18,446,744,073,709,551,615)。而这种范围的数字能在进行超大数量的变量进行处理时,能怡然自得。
题目思路分析
实际上如果想解决对应题目的问题,我们可以使用“双指针”的方式来解决对应的问题,简短的来说,就是先右指针对于数组进行遍历,在遍历的同时也需要对于数组中的0和1的数量进行统计,如果超出0和1的判断条件的时候就代表着这个子串已经遍历结束了,进而添加对应的结果并返回,而在结果的计算时,还需要减去“1”的数量(题目条件是0的数量是严格大于1的数量)那么结果实际上就是位置之差+1(由于是从逻辑位置1开始!)然后再减去对应的1数量,不断累加,直到右指针达到数组的末尾,返回结果,而使用这个思路就可以解出相关的答案(对于部分条件还是需要更多的完善)
代码实现样例:
#include <iostream>
#include <string>
using namespace std;
int solution(const string& t) {
const int MAXN = 1e5 + 10;
char chs[MAXN];
long long res = 0;
int n = t.length();
for (int i = 1; i <= n; i++) {
chs[i] = t[i - 1];
}
int cnt1 = 0, cnt0 = 0;
for (int l = 1, r = 1; r <= n; r++) {
if (chs[r] == '0') {
cnt0++;
} else {
cnt1++;
}
while (cnt1 >= cnt0 && l <= r) {
if (chs[l] == '0') {
cnt0--;
} else {
cnt1--;
}
l++;
}
res += (r - l + 1);
res -= 2LL * cnt1;
}
return static_cast<int>(res);
}
int main() {
cout << (solution("10010")==6) << endl;
cout << (solution("10010") == 6) << endl;
cout << (solution("010101") == 3) << endl;
return 0;
}
题目输出结果
提交截图
写在最后
在经历互联网的搜索与查找,实际发现,本题的源题模型来源于2024年携程秋招研发岗第一批第五题