2021-10-22刷题总结
Posted 一道PTA刷一天
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-10-22刷题总结相关的知识,希望对你有一定的参考价值。
目录
今日刷题总结
单值二叉树(easy)
题目链接 :965. 单值二叉树 - 力扣(LeetCode) (leetcode-cn.com)
题目描述
如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。
只有给定的树是单值二叉树时,才返回 true
;否则返回 false
。
示例
解题思路
递归遍历:用一个布尔类型的辅助函数来完成递归遍历。在主函数中把根节点的值
root.val
与根节点root
传入辅助函数,让辅助函数完成递归 比较。变量:辅助函数参数 一个整数
val
一个节点TreeNode
。
代码
class Solution {
public boolean isUnivalTree(TreeNode root) {
if(root.left == null && root.right == null){
return true;
}
int val = root.val;
return singleNumber(val,root);
}
public boolean singleNumberTree( int val, TreeNode root){
if(root == null){
return true;
}
if(root.val != val){
return false;
}
return singleNumber(val,root.left) && singleNumber(val,root.right);
}
}
相同的树(easy)
题目链接:100. 相同的树 - 力扣(LeetCode) (leetcode-cn.com)
题目描述
给你两棵二叉树的根节点 p
和 q
,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例
解题思路
递归比较:思路很简单啊这道题,遍历两棵树的每一个节点比较值即可,要注意的地方就是某一个节点为空时,另一个是否为空。
万能的递归,哈哈哈哈哈哈又来水题了。
代码
class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
if(p == null){
return q == null;
}
if(q == null){
return p == null;
}
if(p.val != q.val ){
return false;
}
return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);
}
}
二进制表示中质数个计算置位(easy)
题目链接:二进制表示中质数个计算置位
题目描述
给定两个整数
L
和R
,找到闭区间[L, R]
范围内,计算置位位数为质数的整数个数。(注意,计算置位代表二进制表示中1的个数。例如 21 的二进制表示 10101 有 3 个计算置位。还有,1 不是质数。)
示例
输入: L = 10, R = 15
输出: 5
解释:
10 -> 1010 (2 个计算置位, 2 是质数)
11 -> 1011 (3 个计算置位, 3 是质数)
12 -> 1100 (2 个计算置位, 2 是质数)
13 -> 1101 (3 个计算置位, 3 是质数)
14 -> 1110 (3 个计算置位, 3 是质数)
15 -> 1111 (4 个计算置位, 4 不是质数)
注意
L, R
是L <= R
且在[1, 10^6]
中的整数。
R - L
的最大值为 10000。
解题思路
枚举+位运算:
枚举:因为本题
L
与R
范围在 10 ^ 6 内,故而R的二进制整数表示不超过20位( 2 的 20 次为 1048576 ),故位数中最大大的质数为 19,数据量较少,便可以考虑枚举出 2 - 20 内的质数。
位运算:昨天发的文章妙用位运算中便有快速求解一个数中二进制位为1的个数,即 lowbit。
不知道的小伙伴我可以去看看哦,链接放在这里了。
代码
class Solution {
public int countPrimeSetBits( int left, int right) {
int count = 0;
while( left <= right ) {
int sum = 0;
int m = left;
while(m != 0){
int c = m & ( -m);
m -= c;
sum ++;
}
left ++;
count = check(sum) ? count + 1 : count;
}
return count;
}
public boolean check(int num){
return num == 2 || num == 3 || num == 5 || num == 7 || num == 11 ||num == 13||num == 17||num == 19;
}
}
只出现一次的数(mid)II
题目链接:只出现一次的数字 II - 提交记录 - 力扣(LeetCode) (leetcode-cn.com)
题目描述
给你一个整数数组
nums
,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
示例
输入:nums = [2,2,3,2] 输出:3 输入:nums = [0,1,0,1,0,1,99] 输出:99
解题思路
哈希表:遍历该数组,通过创建哈希表记录每个数字出现的次数,返回出现次数为1元素的即可。
位运算:我们知道,如果两个数不相等,那么他们一定有某几位二进制数是不相同的,所以我们可以通过记录数组中所有数第k位二进制数中1出现的次数count,如果该数在数组中出现了三次,那么count一定可以被3整除,反之,出现一次的那个数在第k位一定为1,我们只需记录每一个这样的k位,把得到的每一个 1 << k 相加即可。
位运算文章:妙用位运算_
代码
class Solution {
public int singleNumber(int[] nums) {
if(nums.length == 1){
return nums[0];
}
int res = 0;
for(int i =0;i < 32 ;i ++){
int count = 0;
for(int item : nums){
if(( item & 1 << i) == 1<<i){
count ++;
}
}
if(count %3 == 1){
res |= (1 << i);
}
}
return res;
}
}
补充
今天看了N皇后及其优化问题,果真是初学者的噩梦,不过看完也算是理解了一些递归特性,长芝士长芝士!!!
好了,今天就先到这里吧(又是水题的一天),明天继续加油鸭。
以上是关于2021-10-22刷题总结的主要内容,如果未能解决你的问题,请参考以下文章