- 這道題體面要求是四個數(shù)芬失,填入+楣黍、-、*棱烂、/和()租漂,來使其結(jié)果為24,實際上可以看成一個組合問題颊糜,比如從四個數(shù)中任意取出2個哩治,算出和,在與剩下的兩個數(shù)組合到一起衬鱼,重復(fù)這個過程业筏,如果最后能得到24,就返回True,否則返回False鸟赫,比較簡單蒜胖。代碼如下:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
class Solution {
boolean flag = false;
public void search(List<Double> nums) {
if(flag) return;
if (nums.size() == 1) {
if (Math.abs(nums.get(0)-24) < 0.000001) flag = true;
return;
}
int nums_size = nums.size();
for (int i = 0; i < nums_size; i++) {
for (int j = i + 1; j < nums_size; j++) {
double ni = nums.get(i), nj = nums.get(j);
ArrayList<Double> temp_nums = new ArrayList<>();
for (int k = 0; k < nums_size; k++) {
if( k != i && k != j) temp_nums.add(nums.get(k));
}
List<Double> temp_res = new ArrayList<>();
temp_res.addAll(Arrays.asList(ni + nj, ni * nj, ni - nj, nj - ni, ni / nj, nj / ni));
for (double t : temp_res) {
temp_nums.add(temp_nums.size(), t);
search(temp_nums);
temp_nums.remove(temp_nums.size()-1);
}
}
}
}
public boolean judgePoint24(int[] nums) {
List<Double> nums_d = new ArrayList<>();
for (int i = 0; i < nums.length; i++) nums_d.add((double) nums[i]);
search(nums_d);
return flag;
}
public static void main(String[] args) {
Solution s = new Solution();
int[] nums = {1, 1, 1, 1};
// int[] nums = {4, 1, 8, 7};
System.out.println(s.judgePoint24(nums));
}
}
- 需要注意的點是List的Remove和Add操作,Remove操作時抛蚤,一定要是準(zhǔn)確的index台谢,不能越界,Add時岁经,Add的Index可以是List Size朋沮,表示加在最后一個。