牛客刷题笔记
HJ1 字符串最后一个单词的长度 | getline(cin, s) 收录一行的输入,直接用cin>>s输入,无法保留空格 | |
HJ2 计算某字符出现次数 | isLower(c)判断小写,c =c+'A'-'a'; 从小写变大写; | isupper()检查大写,isalpha()检查字母, tolower变小写,toupper变大写。 |
HJ3 明明的随机数HJ3 | 排序后,用for循环顺序输出数组内容,省去去重的步骤 | |
HJ4 字符串分隔HJ4 | 优化代码写法,先给字符串的按8对齐补0,再8个8个输出 | |
HJ5 进制转换 | isdigit(x)判断是否为整数; s[i]-'0'字符转为整数;s[i] - 'A'+10,十六进制字母转为整数 | |
HJ6 质数因子 | 算法平方根sqrt() ,循环除以质数2 ,3 | |
HJ7 取近似值 | double n,减去int n,大于等于0.5即加一,否则正常输出 | |
HJ8 合并表记录 | 使用map,涉及头文件<bits/stdc++.h>, 索引下标相同的值直接加;哈希的索引默认升序 | |
HJ9 提取不重复的整数 | reverse()反转字符串,通过一个temp[]做记录,进行去重输出 | |
HJ10 字符个数统计HJ10 | 终于遇到个没看题解的;用一个数组去标记下每个数出现次数,相当于去重累加就好了 | |
HJ11 数字颠倒 | for循环逆序输出就行 | |
HJ12 字符串反转 | 把上一题代码粘贴过来就行 | |
HJ13 句子逆序 | 带空格字符串输入,需要用到vector,并且用vector.pushback入栈。revserve倒序vector,for循环输出即可 | |
HJ14 字符串排序HJ14 | 使用vector,x.resize重置 vector变量大小,sort自动对字符串按字典升序排序;sort的头文件是algorithm | 要是逆序怎么搞? |
HJ15 求int型正整数在内存中存储时1的个数HJ15 | 可以用x&1来判断末尾是否为1; while循环,x=x>>1,来慢慢右移 | 这不刷题谁知道? |
学习0-1背包问题 | 状态转移方程dp[i][j] = max{ dp[i-1][j], dp[i-1][j-w[i]] + v[i]} } | 动态规划-01背包基础问题,不算变种。 |
HJ16 购物单HJ16 | 01背包变种,通过4种主附件状态转移成01背包问题。 | 这道题需要复习 |
HJ17 坐标移动 | getline(cin>>,s,' '); isdigit()是否为整数判断; pair<int ,int >变量 stoi()字符串强转为整数 s.substr(1)取从字符串的第一位往后 | 小tips比较多 |
HJ18 识别有效的IP地址和掩码并进行分类统计HJ18 | istringstream是一个输入字符串流类,它可以将一个字符串分解为多个部分,并以适当的数据类型进行处理。istringstream类定义在<sstream>头文件中, find_first_of 是一种C++函数,查找在字符串中第一个与指定字符串中的某个字符匹配的字符,返回它的位置。 | 这个题需要复习 感觉这个题主要考察对复杂模拟的实现,对语言自带库函数的熟悉程度。 同时发现做题python应该比c++更灵活些 |
HJ19 简单错误记录 | c++中.find()找寻连续的变量中是否存在某个元素,如果不存在,就返回.end() ①需要注意对文件路径到文件名的处理 ②处理文件名时,使用.substr时下标的精确处理 ③map的应用处理 | 这道题需要复习 |
HJ20 密码验证合格程序 | isupper,islower,isdigit的使用,双重for循环检查重复字符的使用,模拟,注意边界值判断 | |
HJ21 简单密码HJ21 | 居然有'X'...'Y',省略号的操作! | 注意边界值检查,多道题有类似问题了 |
HJ22 汽水瓶 | 其实就是除以2向下取整,思路很清奇,背题吧 | |
HJ23 删除字符串中出现次数最少的字符 | map的应用,再留意下map的头文件在bits/stdc++.h里 | |
HJ24 合唱队HJ24 | 从前往后求最大递增子序列,从后往前求最大递减子序列,两者对位相加-1,就是留在场上最多人数 | 需要好好理解下 |
HJ25 数据分类处理HJ25 | 对模拟的考验,需要熟悉各种库函数,子函数的应用。to_string, set,set.insert去重插入并自动排序,stoi整数强转,string::npos表示没找到返回该值等等 | 需要重视,复习 |
HJ26 字符串排序HJ26 | isalpha判断是否为字母。这个题取巧了。直接用26循环边界,判断是否为字母 | 取巧了 |
HJ27 查找兄弟单词HJ27 | 字典序即可用sort默认排序,用vector将所有兄弟字符串放到字符串数组里,输出第K个 | 没认真看,字符串处理,可以回顾一下 |
HJ28 素数伴侣 | 什么是素数(质数)?只需要找它有无因子即能否被整除即可。从2开始遍历到该数前一个数n-1,查看每个数能否整除n,如果可以整除即不是,否则是。其实不用遍历到n-1,遍历到根号n即可,因为后面如果有因子,必定是乘上另一个小于根号n的数字。那前面就已经验证过了。 | 了解如果用代码实现,判断一个数是否为素数,然后模拟实现即可。 对素数检查的实现可以了解下。 这道题需要复习。 |
HJ29 字符串加解密 | b[a.find_last_of(s1[i])] 字符串.find_last_of,用于在字符串中逆向查找指定字符集合中任意字符的最后一次出现位置 顺便这道题用字典秒了 | |
HJ30 字符串合并处理 | sort ()在algorithm里 首先是把奇偶的字符单独提出来后,用sort排序,再拼接回去。 接下来的模拟就看不懂了,等复习吧。 | 最近好累,仍是字符串模拟处理。 考验对模拟的掌握 |
HJ31 单词倒排 | 首先把不必要的非字母字符用空格统一替代,然后用streamstring ,根据空格分隔字符串,存入数组,逆序输出 stringstream input(s); while(input>>s){ // 按照空格分隔字符串 | 解法很巧妙,也反映了自己对模拟的生疏 |
HJ32 密码截取HJ32 | 回文字符串的判断和处理;奇位和偶位的回文字符串处理;取最长的字符串。 | 回文,模拟,字符串处理 |
HJ33 整数与IP地址间的转换HJ33 | 用scanf巧妙的把ip地址赋值到4个数里,左移对应24 16 8位就是十进制值,相加即可; 同时有对十进制值,转换位2进制数,分别右移24 16 8位即位2进制值,num -(a<<24)即将高位清零。 | 位运算 |
HJ34 图片整理HJ34 | sort 秒了 | e.... |
HJ35 蛇形矩阵HJ35 | 横列数列赋值,两个for循环就来回蒙吧。蒙对就答出来了 | 你就学吧 |
HJ36 字符串加密HJ36 | 主要还是字符串去重,和对未出现字母的补充。视频里用bool类型vector变量处理的方式很奇特,但用find(begin, end,key)的方法更简单,find返回end即是没找到。 字符串处理完后对下表索引的查找就无所谓了,简单处理就行 | |
HJ37 统计每个月兔子的总数HJ37 | 第一种方法:int a,b,c。a 是不低于两个月的数量,b是低于2个月的数量,c是刚出生数量。 第二种方法:列函数,f(n) = f(n-1)+f(n-2) | 为什么我感觉好难想。 |
HJ38 求小球落地5次后所经历的路程和第5次反HJ38 | 瞪眼法秒了 | |
HJ39 判断两个IP是否属于同一子网 | 模拟,①定义vector数组,用while(cin>>mask[0]>>c>>mask[1]>>...)这样分段输入ip地址 ②对ip地址合法性进行判断,对掩码合法性进行判断 ③ip地址和掩码继续&运算 | 虽然是困难题,但模拟过程相对好理解,题意也好理解,感觉算中等题 |
HJ40 统计字符HJ40 | 考验对库函数的掌握。 ①不能直接cin,要用getline(cin,s) ②isdigit整数判断,isalpha字母判断,' '空格,然后其他 | 熟悉库函数的瞪眼法秒了 不熟悉就G了 |
HJ41 称砝码HJ41 | set的应用,不过后续set的处理,给我看晕了 | 复习把 |
HJ42 构造C的歪HJ42 | 瞪眼法秒了 | |
HJ43 迷宫问题HJ43 | 因为只有一条出迷宫路径,所以直接dfs递归就好了。加深了对“搜索”的理解。 | 对递归的理解还是有点怪 |
HJ44 SudokuHJ44(数独) | 我不会 | 考试遇到当倒霉了……算了,有余力抽空回来看看吧 |
HJ45 名字的漂亮度HJ45 | 字符串大小写处理,排序,然后累加 | |
HJ46 截取字符串HJ46 | 瞪眼法秒了 | |
HJ47 【模板】排序HJ47 | 瞪眼法秒了 | |
HJ48 从单向链表中删除指定值的节点HJ48 | 用到了forward_list,头文件同名,用find查询某节点,然后用forward.insert_after去插入,最后用forward.remove删除某节点,最后用 auto it,*it遍历 | 涉及对字符串处理的新方法,需复习 |
HJ49 分数线划定HJ49 | 该用例部分通过,无题解,待后查。 留意使用vector<pair<int,int>> | |
HJ50 四则运算 | 左右括号问题都可以用递归解决 | 需复习,弱理解递归 |
HJ51 输出单向链表中倒数第k个结点 | 瞪眼法秒了,注意用while(cin>>n)输入 | |
HJ52 计算字符串的编辑距离HJ52 | 动态规划似乎就是填一个二维表,想出来递推枚举规则就行 | 但是我想不出来,需复习,弱动态规划 |
HJ53 杨辉三角的变形HJ53 | 特殊情况,找规律 | |
HJ54 不要三句号的歪 | 这题主要用到了截取字符串的.substr(a,b)和强转整数stoi(),需附复习 | |
HJ55 挑7HJ55 | 主要是while(a>0){xxx; a=a/10;}对每一位做判断。 | 也是掌握技巧就行 |
HJ57 高精度整数加法 | 通过str.insert(str.begin(),'0')从开头插入0补足两个字符串,同时减去'0'得到正常数字。 | 很精巧 |
HJ58 输入n个整数,输出其中最小的k个 | 瞪眼法秒了 | 用vector,就能用sort会方便些 |
HJ59 找出字符串中第一个只出现一次的字符 | 用map<char, int>秒了 | |
HJ60 查找组成一个偶数最接近的两个素数HJ60 | 牢记判断素数的方法,for里i=2开始,并且i%2不能等于0; 再用pair<int ,int >和abs取绝对值,秒了 | |
HJ61 放苹果HJ61 | 放苹果最简单的动态规划。锁定条件,扔1个盘子不放水果,直到盘子扔完 ;和每个盘子至少放一个水果。 | 动态规划仍然很难理解,就当是强模拟吧 |
HJ62 查找输入整数二进制中1的个数HJ62 | 位运算,a&1==1,查看二进制1的个数,然后一直除以2判断即可 | 额,位运算判断记一下吧 |
HJ63 DNA序列HJ63 | 滑动窗口 | 复习滑动窗口可以参考这个 |
HJ64 MP3光标位置HJ64 | 对一个长度为4的链表的处理 | 很实际,很巧妙 |
HJ65 查找两个字符串a,b中的最长公共子串HJ65 | 滑动窗口。留意string a.find(tmp) != string::npos, 查询字符串中的子串。以及全局变量的定义 | |
HJ66 配置文件恢复HJ66 | 思路,先建立字典,然后通过查询命令空格的数量,区别单单词命令和多单词命令;通过空格下标,取拆分多单词命令,并用find 判断,是否命令是唯一的,有无歧义。最后输出。 | vector<vector<string>> tp多维数组定义函数要熟悉下 int n = count(str.begin(),str.end(), ' '); count查询字符串中某字符的数量 if(str.find(strings) == 0)字符串是否包含某字符或字符串 string s1 = str.substr(0, l); string s2= str.substr(l+1, s.size()-l-1) 通过str拆分单词,s1是从下标0开始,截取l个字符 |
HJ67 24点游戏算法 | 4则运算,4个数字运算,实则拆分成两两的计算,用三四层for循环强行覆盖结果就好了。其中,应用了next_permutation 这个全排列库函数是最恶心的,这谁能想到,自己想办法全排列也行 | 工作破防了,淦 |
