最大乘积
把 1~9 这9个数字分成两组,中间插入乘号,
有的时候,它们的乘积也只包含1~9这9个数字,而且每个数字只出现1次。
比如:
984672 * 351 = 345619872
98751 * 3462 = 341875962
9 * 87146325 = 784316925
...
符合这种规律的算式还有很多,请你计算在所有这些算式中,乘积最大是多少?
注意,需要提交的是一个整数,表示那个最大的积,不要填写任何多余的内容。 (只提交乘积,不要提交整个算式)
给出我写的代码:
package 第九届;
import java.util.HashSet;
import java.util.Set;
public class Main02 {
static int max=0;
// 1-9全排列
public static void main(String[] args) {
int[] nums = {1, 2, 3, 4, 5, 6, 7, 8, 9};
dfs(nums, 0, 8);
System.out.println(max);
}
public static void dfs(int[] nums, int p, int q) {
if (p == q) {
int temp=0;
for (int i = 0; i < nums.length; i++) {
temp = temp * 10 + nums[i];
}
for (int j = 1; j <= 8; j++) {
String part1 = String.valueOf(temp).substring(0, j);
String part2 = String.valueOf(temp).substring( j);
int a=Integer.parseInt(part1)*Integer.parseInt(part2);
if(check(a)) {
max = Math.max(a, max);
}
}
} else {
for (int i = p; i <= q; i++) {
swap(nums, p, i);
dfs(nums, p + 1, q);
swap(nums, p, i);
}
}
}
public static boolean check(int a){
String s = String.valueOf(a);
Set set=new HashSet();
for(int i=0;i<s.length();i++){
set.add(s.charAt(i));
}
return set.size()==9 && !s.contains("0");
}
public static void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
dfs全排列模版
看着是不是很复杂,我简化一下思路是这样
//主函数就不用说了
public static void main(String[] args) {
int[] nums = {1, 2, 3, 4, 5, 6, 7, 8, 9};
dfs(nums, 0, 8);
System.out.println(max);
}
//dfs实现简化(无具体方法)
public static void dfs(int[] nums, int p, int q) {
//判断结束条件,因为是递归,所以当p递归到p的时候,我们就让函数停止
//有以下代码
if(p==q){
//函数结束,进行你想要完成的操作
test();
}
else{
//这就是dfs核心体了
/*这里我们选择循环交换后进行全排列,比如123,将2放第一位,剩下交换全排列,
回溯之之后,将3放到第一位,剩下交换全排列。
①1 2 3 -> 1 3 2 回溯
②2 1 3 -> 2 3 1 回溯
③3 2 1 -> 3 1 2
之后的p变成了q,结束!
*/
for (int i = p; i <= q; i++) {
swap(nums, p, i);
dfs(nums, p + 1, q);
swap(nums, p, i);
}
}
}