2021-10-22刷题总结

Posted 一道PTA刷一天

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-10-22刷题总结相关的知识,希望对你有一定的参考价值。

目录

今日刷题总结

单值二叉树(easy)

相同的树(easy)

二进制表示中质数个计算置位(easy)

只出现一次的数(mid)II

补充


今日刷题总结

单值二叉树(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)

题目描述

给你两棵二叉树的根节点 pq ,编写一个函数来检验这两棵树是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。


示例

 

解题思路

递归比较:思路很简单啊这道题,遍历两棵树的每一个节点比较值即可,要注意的地方就是某一个节点为空时,另一个是否为空。

万能的递归,哈哈哈哈哈哈又来水题了。

代码

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)

题目链接:二进制表示中质数个计算置位

题目描述

给定两个整数 LR,找到闭区间 [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 不是质数)

注意

  1. L, RL <= R 且在 [1, 10^6] 中的整数。

  2. R - L 的最大值为 10000。


     

解题思路

枚举+位运算:

  • 枚举:因为本题LR范围在 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刷题总结的主要内容,如果未能解决你的问题,请参考以下文章

2021.10.22--《21-22-1蓝桥训练3》

Java工程师面试题,二级java刷题软件

算法刷题总结

算法刷题总结

算法刷题总结

python常用代码片段总结