没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
基础版:适合于刚掌握语言的同学,先刷一些题熟悉语言
入门级别:
1、输入处理 HJ5.进制转换
2、排列组合(牛客搜索)NC61.两数之和
3、递归:NC68.跳台阶
4、快速排序 HJ3.明明的随机数
5、哈希表 HJ10.字符个数统计
字符串操作:
1、HJ17.坐标移动
2、HJ106.字符串逆序
3、HJ33.整数与 IP 地址间的转换
排序:
1、HJ8.合并表记录
2、HJ14.字符串排序
栈:
2、Leetcode1614:括号的最大嵌套深度
排列组合:
1、NC17:最长回文子串
深度/广度搜索:
HJ41:称砝码
这些题一定要去刷刷,提升自己语言掌握能力,等这些题刷通顺了开始刷进阶体
型,主要是针对各部分题型做专项提升
二、进阶篇:针对常见问题专项提升
系统设计题,DFS,BFS,杂项,
该阶段可以刷专项题型也可以直接刷下面的原题,但是原题没有考试环境,
没办法测试用例完备程度。下面的分享几乎都是原题,并不难,但是有时候思路
很重要,注意一定要都去理解下 100 分值的题(优先看下,争取都自己刷一遍)
总体合集:
一定要保证考前去遍历一下题库,注意主要是为了找下做题的思路,时间充
足的可以尝试去做一下这些题,更全的题库如下:
上面包含各个版本的语言解题思路,但是需要订阅才能获取,各位同学可以
按需获取
题库:
这是牛客网题库 可以练习一下输入输出
www.newcoder.com/ta/huawei
刷简单和中等难度的
题型:三道题是简单+简单+中等难度的题型。
第一二题可能会是循环、数组、字符串、栈这些,
第三题会难一点,二分查找、动态规划、DFS、BFS 这些。
参考资料:可看一下 leetcode 网的典型练习题目,编号如下:
字符串:3,49,30
线性表:86,16,27,732
队列:641,406,899
栈:946,116,117,895
哈希表:61,729,25,554
dfs:105,112,98,494,547,1254
bfs:1091,1129,102,101,752
1.【完美走位】
题目详情
一、题目
输入一个长度为 4 的倍数的字符串,字符串中仅包含 WASD 四个字母。
将这个字符串中的连续子串用同等长度的仅包含 WASD 的字符串替换 Q,
如果替换后整个字符串中 WASD 四个字母出现的频数相同,那么我们称替换后
的字符串是“完美走位”。求子串的最小长度。
如果输入字符串已经平衡则输出 0。
二、输入
一行字符表示给定的字符串 s 数据范围:
1<=n<=10^5 且 n 是 4 的倍数,字符串中仅包含 WASD 四个字母。
三、输出一个整数表示答案
四、样例输入
输出示例 1:输入:WASDAASD 输出:1
说明:将第二个 A 替换为 W,即可得到完美走位。
示例 2:输入:AAAA 输出:3
说明:将其中三个连续的 A 替换为 WSD,即可得到完美走位
解题思路
1:先用一个 map 统计出字符串所有的字符个数,然后先看是否"完美"。
2:再利用经典的尺取法。
从左往右移动区间,当满足条件时,左端点右移,缩小区间,当不满足条件时,
右端点右移,扩大区间,这样可以找到每个满足条件的区间,从而可以找到最小
区间。
记录不包含该区间时 WMASD 的数量,先判断能否通过替换区间内的元素使
WASD 数量一致,再判断剩余位置是否是 4 的倍数。
代码示例
#include<iostream>
#include<vector>
#include<stdlib.h>
#include<algorithm>
#include<string.h>
#include<exception>
#include<map>
#include<cmath>
#include<unordered_map>
#include<set>
#include<climits>
#include<ctype.h>
#include<queue>
#include<stack>
#include<list>
using namespace std;
int main(){
// 处理输入
string input_str ;
cin >> input_str;
map<char, int> char_count;
for (auto x : input_str) {
if (char_count.count(x)) {
char_count[x] +=1;
} else {
char_count[x] =1;
}
}
// 特殊情况
if (char_count['W'] == char_count['A'] &&
char_count['W'] == char_count['S'] &&
char_count['W'] == char_count['D']) {
cout << 0;
return 0;
}
// 左右区间位置
int left = 0;
int right = 0;
int length = 0;
// 替换的最小长度
int res = input_str.size();
// 出现次数最多的字母
int max_char_num = 0;
// 可替换字母个数, 随着指针移动,如果 free_char_num 大于 0 且能被 4 整
除,当前范围满足条件,左指针右移一格,否则右指针右移
int free_char_num = 0;
char_count[input_str[0]]--;
while (true)
{
max_char_num = max(max((max(char_count['W'], char_count['S'])),
char_count['A']), char_count['D']);
length = right - left + 1;
free_char_num = length - ((max_char_num - char_count['W']) +
(max_char_num - char_count['S']) + (max_char_num - char_count['A']) +
(max_char_num - char_count['D']));
if (free_char_num >= 0 && free_char_num % 4 == 0){
if(length<res) {
res = length;
}
char_count[input_str[left]]++;
left++;
} else {
right++;
char_count[input_str[right]]--;
}
if (right >= input_str.size())// 越界即结束
break;
}
cout << res;
return 0;
}
2.【字符串重新排列】
题目详情
给定一个字符串 s,s 包括以空格分隔的若干个单词,请对 s 进行如下处理后输
出:
1、单词内部调整:对每个单词字母重新按字典序排序
2、单词间顺序调整:
1)统计每个单词出现的次数,并按次数降序排列
2)次数相同,按单词长度升序排列
3)次数和单词长度均相同,按字典升序排列请输出处理后的字符串,每个
单词以一个空格分隔。
输入描述:一行字符串,每个字符取值范围:【a-ZA-Z0-9】以及空格,字符串长
度范围:【1,1,1000】
例 1:
输入
This is an apple
输出
an is This aelpp
例 2:
输入:
My sister is in the house not in the yard
输出:
in in eht eht My is not adry ehosu eirsst
解题思路
1:题目还是比较简单的,直接两步排序即可,需要细心的地方有两个
A:就是排序是降序还是升序。
B:输出的时候要输出单词原有的个数。
代码示例
#include<iostream>
#include<vector>
#include<algorithm>
#include<iomanip>
#include<string>
#include<exception>
#include<map>
using namespace std;
bool comp(pair<string, int> a, pair<string, int> b) {
//次数降序、长度升序、字典序排列升序
if (a.second > b.second) {
剩余33页未读,继续阅读
资源评论
月立BT
- 粉丝: 2
- 资源: 72
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功