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

941 阅读3分钟

这是我参与8月更文挑战的第24天,活动详情查看:8月更文挑战 在这里插入图片描述

⚽算法题

给定一个无重复元素的正整数数组 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线程