30个选择,3道编程题。
1.24点
给出4个1-10的数字,通过加减乘除,得到数字为24就算胜利。leetcode上困难题
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;public class Solution {public boolean judgePoint24(int[] nums) {List<Double> numbers = new ArrayList<Double>();for (int num : nums) {numbers.add((double) num);}return solve(numbers);}/*** @description 回溯法,从数组中选出两个数,把运算结果加到数组中*/private boolean solve(List<Double> numbers) {if (numbers.size() == 1) {//数组中只剩下一个数的时候判断结果return Math.abs(numbers.get(0) - 24) < 1e-6;//看是否与24相等}//从numbers中取出两个数,把结果放入数组中for (int i = 0; i < numbers.size(); i++) {for (int j = 0; j < numbers.size(); j++) {if (i != j) {//取不同的两个数//如果回溯的话,还要恢复现场,把数插回原位置,所以不如直接生成一个新数组List<Double> nums = new ArrayList<Double>();for (int k = 0; k < numbers.size(); k++) {if (k != i && k != j) {//把剩下的数加入到新数组nums.add(numbers.get(k));}}Set<Double> doubles = calculate(numbers.get(i), numbers.get(j));//获取两个数运算的结果集for (Double aDouble : doubles) {nums.add(aDouble);//把两个数运算的结果,分别加入到新数组中if (solve(nums)) {//找到一个结果,立即返回return true;}nums.remove(nums.size() - 1);//恢复现场}}}}return false;//如果没有找到结果,返回false}/*** @description 返回两个数计算得到的结果集*/private Set<Double> calculate(double a, double b) {Set<Double> res = new HashSet<Double>();res.add(a - b);res.add(b - a);res.add(a + b);res.add(a * b);if (a != 0) {res.add(b / a);}if (b != 0) {res.add(a / b);}return res;}
}
2.有效括号
给定一个只包含括号的字符串,判断字符串是否有效。其中,括号种类包括:'(' ')' '{' '}' '[' ']'。有效字符串需满足:1)左括号必须用相同类型的右括号闭合;2)左括号必须以正确的顺序闭合,注意空字符串可被认为是有效字符串。
class Solution {public boolean isValid(String s) {Map<Character,Character> map = new HashMap<Character,Character>(){{put('{','}'); put('[',']'); put('(',')'); put('?','?');}};if(s.length() > 0 && !map.containsKey(s.charAt(0))) return false;LinkedList<Character> stack = new LinkedList<Character>() {{ add('?'); }};for(Character c : s.toCharArray()){if(map.containsKey(c)) stack.addLast(c);else if(map.get(stack.removeLast()) != c) return false;}return stack.size() == 1;}
}
3.找零
面值1元、4元、16元、64元共计4种硬币,以及面值1024元的纸币。现在小Y使用1024的纸币购买了一件价值为N(0<N<=1024)的商品,请问最少他会收到多少硬币。
public static int leastCoins(int N){int res = 1024-N;int count = 0;int index = 3;int[] coin = new int[]{1,4,16,64};while(res != 0){count += res / coin[index];res = res % coin[index];index--}return count;}