刷题强训 (day1) -- 数字统计
1、数字统计
1.1题目
1.2 思路
根据题目得知我们要统计2出现的次数,那么这就是一个枚举 + 数字拆分的过程,先设一个变量count统计2出现的次数,那么count怎么变化呢? 当然了出现一个2,count就+1,重点在于如何数字拆分,比如222,count该怎么++,我们只需要%10,/10即可,222%10 = 2,这时候count就++,222/10 = 22,再%10,再/10,去比对是否等于2即可,理清思路,我们就可以去写代码了
1.3 代码实现
#include <iostream>
using namespace std;
int main() {
int L, R;
cin >> L >> R;
int count = 0;
for(int i = L;i <= R;i++)
{ //防止i发生变化,定义tmp记录此时的i
int tmp = i;
while(tmp)
{
if(tmp % 10 == 2)
count++;
tmp /= 10;
}
}
cout << count << endl;
return 0;
}
2、两个数组的交集
2.1 题目
2.2 思路
读完题目我们可以想到要遍历两个数组,如果有相同的数字就插入到新数组中。
但是有个小细节,注意去重问题,这里就可以使用哈希表,先将第一个数组中的全部元素放到哈希表中,看看第二个数组中有没有相同元素在哈希表中,如果有则放到新的数组中,
这里我们可以以数组模拟哈希,用bool类型的数组,用数组下标标记是否存在哈希表中。那么如何去重呢,就是当我们将相同的数放到新数组中的同时,将哈希表中的数删除,即将当前位置置为false。理清思路,接下来就是代码实现;
2.3 代码实现
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2)
{
bool hash[1001] = {0};//这里也可以初始化为false
vector<int> ret;
for(auto x : nums1)
hash[x] = true;
for(auto x : nums2)
{
if(hash[x])
{
ret.push_back(x);
hash[x] = false;
}
}
return ret;
}
};
3、点击消除
3.1 题目
3.2 思路
读完题后我们知道本题是要消除相邻字母,最后输出剩余字母,消除全部则输出0.
这里联想想到一个括号匹配的题目,使用栈来解决这一类题目,使用先入后出的特性比较容易处理,先进一个字母,后续每一个字母和栈顶元素比较,相同则出栈,最终栈中剩余字母则是我们需要输出的字符串
这里我们可以用可变长的数组来模拟栈,这里我们就使用string,string可以从尾部进行尾删和尾插,因为如果真的使用栈我们最终得到的是一个逆序的字符串,还要reverse一下,这里可以提升一点效率。ok,理清思路,接下来就是编写代码了
3.3 代码
#include <iostream>
using namespace std;
int main()
{
string s,ret;//用ret来模拟栈
cin >> s;
for(auto ch : s)
{ //栈不为空,且入栈元素等于栈顶元素,则出栈
if(ret.size() && ret.back()==ch)
ret.pop_back();
else
ret += ch; //入栈
}
if(ret.size()) //记得判空,栈为空则输出0
cout << ret << endl;
else
cout << 0 << endl;
return 0;
}
本篇完,下篇见!