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

390 阅读2分钟

这是我参与8月更文挑战的第26天,活动详情查看:8月更文挑战

🌟算法题

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

示例 1:

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例 2:

输入:nums = [0,1]
输出:[[0,1],[1,0]]
示例 3:

输入:nums = [1]
输出:[[1]]
 
提示:

1 <= nums.length <= 6
-10 <= nums[i] <= 10
nums 中的所有整数 互不相同

🌟一点点思路

感觉这道题思路还是挺明了的,你看nums = [0,1]的情况有[[0,1],[1,0]]这不就相当于把所有情况都遍历一下吗但是要保证元素不重复。理是这个理但是怎么实现呢?,难不成你要全部实现从一遍历到最后啊这可是指数级别的。最简单的方法还是递归和回溯。我们今天来具体说说什么是回溯。出现很多次了在我们的题里面。

回溯法:一种通过探索所有可能的候选解来找出所有的解的算法。如果候选解被确认不是一个解(或者至少不是最后一个解),回溯算法会通过在上一步进行一些变化抛弃该解,即回溯并且再次尝试

🌟源码和详解

class Solution {
    public List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> res = new ArrayList<List<Integer>>();
//封装成list为了后面操作,因为数组可用的方法比较少
        List<Integer> output = new ArrayList<Integer>();
        for (int num : nums) {
            output.add(num);
        }

        int n = nums.length;
        backtrack(n, output, res, 0);
        return res;
    }
//n为nums的长度res用来存放结果first用来存放结果
    public void backtrack(int n, List<Integer> output, List<List<Integer>> res, int first) {
        // 回溯和递归的核心都差不多一定要判断好结束的条件
        //所有数都填完了
        if (first == n) {
            res.add(new ArrayList<Integer>(output));
        }
        for (int i = first; i < n; i++) {
            // 动态维护数组
            Collections.swap(output, first, i);
            // 继续递归填下一个数
            backtrack(n, output, res, first + 1);
            // 撤销操作
            Collections.swap(output, first, i);
        }
    }
}

🌟面试题

今天我们叙说昨天的MyBatis昨天说了他1·是什么,2·优点,3·缺点 今天我们说说的的其他特性

1、MyBatis框架适用场合: MyBatis专注于SQL本身,是一个足够灵活的DAO层解决方案。

对性能的要求很高,或者需求变化较多的项目,如互联网项目,MyBatis将是不错的选择。

2、MyBatis与Hibernate有哪些不同? Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句。

Mybatis直接编写原生态sql,可以严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,因为这类软件需求变化频繁,一但需求变化要求迅速输出成果。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件,则需要自定义多套sql映射文件,工作量大。

Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件,如果用hibernate开发可以节省很多代码,提高效率。

3、#{}和{}的区别是什么? #{}是预编译处理,{}是字符串替换。

Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;

Mybatis在处理时,就是把{}时,就是把{}替换成变量的值。

使用#{}可以有效的防止SQL注入,提高系统安全性。