⚡每日算法&面试题⚡一起肥学6️⃣

Posted 肥学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了⚡每日算法&面试题⚡一起肥学6️⃣相关的知识,希望对你有一定的参考价值。

⚽算法题

给定一个无重复元素的正整数数组 candidates 和一个正整数 target ,找出 candidates 中所有可以使数字和为目标数
target 的唯一组合。

candidates 中的数字可以无限制重复被选取。如果至少一个所选数字数量不同,则两种组合是唯一的。

对于给定的输入,保证和为 target 的唯一组合数少于 150 个。

示例 1:

输入: candidates = [2,3,6,7], target = 7
输出: [[7],[2,2,3]]
示例 2:

输入: candidates = [2,3,5], target = 8
输出: [[2,2,2,2],[2,3,3],[3,5]]
示例 3:

输入: candidates = [2], target = 1
输出: []
示例 4:

输入: candidates = [1], target = 1
输出: [[1]]
示例 5:

输入: candidates = [1], target = 2
输出: [[1,1]]
提示:

1 <= candidates.length <= 30
1 <= candidates[i] <= 200
candidate 中的每个元素都是独一无二的。
1 <= target <= 500

⚽一点点思路

此题总感觉似曾相识的感觉,你们呢?看了一下有一个简单的思路,它不就要得到与target值相同的数列的和嘛,我就以两数相加和target比较呗小了向前找更大的数相加,不行就三个数相加。说白了就是递归嘛。好了有想法了我们就动手。

⚽源码和题解

具体实现呢这次开始来点硬货了,关于数据结构我们之前只说过链表还有栈。今天我们参与进来了二叉树中的深度优先遍历这是搜索里面的精髓。不怎么会的同学可以留言或者私信我给你们找资源讲解。

class Solution {
	public List<List<Integer>> combinationSum(int[] candidates, int target) {
        List<List<Integer>> ans = new ArrayList<List<Integer>>();
        List<Integer> combine = new ArrayList<Integer>();
        dfs(candidates, target, ans, combine, 0);
        return ans;
    }
//下面使用深度优先的方法来搜索符合的数字组合target2是用来记录还剩下多少到达
//target的,arr是用来存放结果的,combine是存放正在组合中的数组的
//temp是一个指针来记录位置的
    public void dfs(int[] candidates, int target2, List<List<Integer>> arr, List<Integer> combine, int temp) {
    	//多次强调递归一定要清楚它的结束条件,下面是两个条件不清楚可以问我
        if (temp == candidates.length) {
            return;
        }
        if (target2 == 0) {
            arr.add(new ArrayList<Integer>(combine));
            return;
        }
        // 直接跳过相当于移动了temp来进行下一位置的搜索
        dfs(candidates, target2, arr, combine, temp + 1);
        // 选择当前数
        if (target2 - candidates[temp] >= 0) {
            combine.add(candidates[temp]);
            dfs(candidates, target2 - candidates[temp], arr, combine, temp);
            combine.remove(combine.size() - 1);
        }
    }
}

⚽面试题

为什么kafka效率这么高?

kafka的IO效率这么高的原因:
(1)第一个是在写入数据的时候第一个就是因为kafka是顺序写入数据的,把普通的那种随机IO变成了顺序IO,这样的话写入数据的速度就比较快

(2)第二个就是kafka读取数据的时候是基于sendfile实现Zero Copy

传统的数据读取的流程是: 基于sendfile实现Zero Copy调用read函数,文件数据被copy到内核缓冲区
read函数返回,文件数据从内核缓冲区copy到用户缓冲区
write函数调用,将文件数据从用户缓冲区copy到内核与socket相关的缓冲区。 数据从socket缓冲区copy到相关协议引擎。

但是kafka的读取时这样的: sendfile系统调用,文件数据被copy至内核缓冲区
再从内核缓冲区copy至内核中socket相关的缓冲区 最后再socket相关的缓冲区copy到协议引擎
(3)第二个就是kafka的数据压缩,Kafka使用了批量压缩,即将多个消息一起压缩而不是单个消息压缩
(4)第三个就是kafka的生产者在进行生产消息的时候,采用的是批量发送和双线程,其实就是使用了双线程,主线程和Sender线程

特别介绍

📣小白练手专栏,适合刚入手的新人欢迎订阅编程小白进阶

📣python有趣练手项目里面包括了像《机器人尬聊》《恶搞程序》这样的有趣文章,可以让你快乐学python练手项目专栏

📣另外想学JavaWeb进厂的同学可以看看这个专栏:传送们

📣这是个面试和考研的算法练习我们一起加油上岸之路

资料领取处

以上是关于⚡每日算法&面试题⚡一起肥学6️⃣的主要内容,如果未能解决你的问题,请参考以下文章

⚡每日算法&面试题⚡一起肥学1️⃣1️⃣(面试linux命令)

⚡每日算法&面试题⚡一起肥学1️⃣0️⃣( 含 HashMap& TreeMap)

⚡每日算法&面试题⚡一起肥学7️⃣

⚡每日算法&面试题⚡一起肥学5️⃣

⚡每日算法&面试题⚡一起肥学4️⃣

⚡每日算法&面试题⚡一起肥学8️⃣