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;
}