秋招笔试算法题汇总
中兴
1.字符排序
给定一个正整数及非负整数 nus 的列表,第一个正整数表示nums列表中数字的总个数,需要将nums列表中数据排列组合出一个最大的数并返回它
思路:排序,拼接,再输出,按照拼接的字符排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| import java.util.*;
public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); String[] nums = new String[n]; for (int i = 0; i < n; i++) { nums[i] = scanner.next(); } Arrays.sort(nums, new Comparator<String>() { @Override public int compare(String a, String b) { String order1 = a + b; String order2 = b + a; return order2.compareTo(order1); } }); if (nums[0].equals("0")) { System.out.println("0"); return; } StringBuilder result = new StringBuilder(); for (String num : nums) { result.append(num); } System.out.println(result.toString()); } }
|
上述代码中的自定义比较器可以用Java8简写
1 2 3
| Arrays.sort(nums, (a, b) -> (b + a).compareTo(a + b));
|
compareTo
是 String
类中的一个方法,作用是比较两个字符串的字典顺序。
- 如果字符串
s1
大于字符串 s2
,s1.compareTo(s2)
返回正整数。
- 如果
s1
等于 s2
,返回0。
- 如果
s1
小于 s2
,返回负整数。
2.动态规划问题
新郎可以一次走一个或者两个台阶,每个台阶都要花费钱这种问题
给定每个台阶的花费,然后求最小花费
思路:动态规划数组,dp[i] = min{dp[i-1]*cost[i-1], dp[i-2],cost[i-2]};
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| import java.util.*;
public class topic { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int[] arr = new int[n]; for (int i = 0; i < n; i++) { arr[i] = scanner.nextInt(); }
int[] dp = new int[n + 1]; dp[0] = 0; dp[1] = 0; for (int i = 2; i <= n; i++) { dp[i] = Math.min(dp[i - 1] + arr[i - 1], dp[i - 2] + arr[i - 2]); } System.out.println(dp[n]); } }
|
深信服
1.石头问题
桌子上放了一排石头,有n个,每块石头的颜色可以是红色,绿色或蓝色。现在要从这排石头取出的数个石头,以便剩余的石头里面,任何两颗相邻的石头具有不同的颜色的(取出1块石头后,就认为两边的石头是相邻的)请根据输入的石头数量、排序和颜色,计算最少要取出几块石头?
思路:遇到重复的,取出,count++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| import java.util.*;
public class topic1 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); String next = scanner.next(); int count = 0; for (int i = 0; i < next.length() - 1; i++) { if(next.charAt(i) == next.charAt(i+1)){ count++; } } System.out.println(count); } }
|
2.最长子数组
给定一个数组,求不重复元素的最长子数组的长度
思路:滑动窗口,使用一个set集合放不重复的元素,更新最大长度