一、 2021(校招)阿里巴巴 7.22 笔试(Java版)
1.1 题目1
给定一个n,求 [1,n] 这 n 个数字的排列组合有多少个。 条件:相邻的两个数字的绝对值不能等于1. 例如: 4 [2, 4, 1, 3] [3, 1, 4, 2]
static List> res; public static void main(String[] args) { res = new LinkedList(); // write your code here Scanner scan = new Scanner(System.in); int N = scan.nextInt(); scan.close(); int nums[] = new int[N]; judge(N, nums, 0, new LinkedList()); for(List list : res){ System.out.println(list); } } public static void judge(int n, int[] nums, int index, List list){ if(index == n){ res.add(new LinkedList(list)); return; } for (int i = 1; i <= n; i++) { if(nums[i-1] == 0 && (list.size() == 0 || Math.abs(list.get(list.size()-1)-i) != 1)){ list.add(i); nums[i-1] = 1; judge(n, nums, index+1, list); list.remove(list.size()-1); nums[i-1] = 0; } } }
1.2 题目2
长度为 n 的数组,数组中每个元素 a 满足:1<=a<=n 求连续区间的数量,要求区间中相同元素的数量 >=m 例如: 5 2 1 2 1 5 2 4 可以有4种可能:[1,3],[1,5],[2,5],[1,4] 思路:用map存一个当前数的list集合,从前往后遍历,符合m条件的,则将对应数量添加到res 并且维护一个变量pt,用来判断当前数不符合m条件,但之前有符合m条件的数出现过的首个数的下标
public static void main(String[] args) { Scanner scan = new Scanner(System.in); int N = scan.nextInt();//数量 int m = scan.nextInt();//相同的个数 Map> map = new HashMap(); int res = 0; int pt = -1;//记录当前元素num前,存在m个相同元素a的第一个元素的下标。不存在则为-1 for (int i = 0; i < N; i++) { int num = scan.nextInt(); if(map.containsKey(num)){ map.get(num).add(i); if(map.get(num).size() >= m){ int pre = map.get(num).get(map.get(num).size() - m); pt = Math.max(pt, pre); } }else{ List list = new LinkedList(); list.add(i); map.put(num, list); } res += pt + 1; } System.out.println(res); }