哈喽~,大家好,我是千羽。
快手三面还是考问的简单几道题,讨论了数据库查询、Redis分布式模式和JDK1.8的优化,同时分享了算法题的回溯法解决方案。问的很常规。算法写出来了,三面求过过过过!!
COUNT(1)
: 这个语法表示对行的计数,不管行中的数据是什么。使用 COUNT(1)
或者 COUNT(*)
都会计算表中的所有行数,不会对具体的列进行计算。
例如:SELECT COUNT(1) FROM table_name;
COUNT(*)
: 与 COUNT(1)
类似,也是对行进行计数,不管行中的数据是什么。它与 COUNT(1)
的效果基本一致,通常被用来计算表中的行数。
例如:SELECT COUNT(*) FROM table_name;
COUNT(col)
: 这个语法中的 col
是指定的列名,COUNT(col)
会对指定列中非 NULL 值的数量进行计数。
例如:SELECT COUNT(col_name) FROM table_name;
java.time
包,提供了新的日期时间 API,解决了旧 API 存在的许多问题,并提供了更好的性能和灵活性。shutdown()
: 这个方法会先允许已经提交的任务(包括正在执行和等待执行的任务)执行完毕,然后关闭线程池。它不会接受新的任务提交,但会等待已提交的任务执行完成后才会关闭线程池。shutdown()
方法返回后,线程池状态将变为 SHUTDOWN
。shutdownNow()
: 这个方法会尝试立即关闭线程池。它会中断所有正在执行的任务,并返回等待执行的任务列表。shutdownNow()
方法会试图停止所有的活动线程,不管是否完成任务。它会立即停止接受新的任务,并尝试终止当前正在执行的任务。shutdownNow()
方法返回后,线程池状态将变为 SHUTDOWN
或者 STOP
。“对于给定一个数组arr,找到和为n的所有集合。例如arr = [1,2,3,4,5,6], n = 7 返回[[1,6], [2,5],[3,4], [1,2,4]]
这个问题可以使用回溯法(backtracking)来解决。回溯法通常用于解决组合、排列和搜索等问题。
使用 Java 实现的回溯法来找到和为目标值的所有集合:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class FindSumCombinations {
public static List<List<Integer>> findCombinations(int[] arr, int target) {
List<List<Integer>> result = new ArrayList<>();
Arrays.sort(arr); // 对数组进行排序
backtrack(arr, target, 0, new ArrayList<>(), result);
return result;
}
private static void backtrack(int[] arr, int target, int start, List<Integer> path, List<List<Integer>> result) {
if (target == 0) { // 如果目标和为0,表示找到了一个组合
result.add(new ArrayList<>(path));
return;
}
for (int i = start; i < arr.length; i++) {
if (arr[i] > target) {
break; // 当前值已经超过了目标和,结束循环
}
// 回溯法:尝试添加当前值到组合中
path.add(arr[i]);
backtrack(arr, target - arr[i], i + 1, path, result);
path.remove(path.size() - 1); // 回溯,移除当前值,尝试下一个可能的值
}
}
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6};
int target = 7;
List<List<Integer>> result = findCombinations(arr, target);
System.out.println(result);
}
}
这段代码会输出 [[1, 6], [2, 5], [1, 2, 4], [3, 4]]
,它使用了回溯法来找到数组中和为目标值的所有集合。
略