题例:将一个正整数拆分成若干个正整数的和
第一次写这种算法,大概花了快两个小时吧。
来自一名招聘者的灵魂拷问,第一次写,写了好久。先不说了上代码。
方法一:
package com.twelve.test;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
/**
-
@author 武
*2019年7月18日15:36:27
*/
public class Demo02 {public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
System.out.println(toStr(calc(n)));
}public static Set calc(int n) {
Set possibility = new HashSet();
Composition composition = new Composition();
switch (n) {
case 1:
composition.add(1);
possibility.add(composition);
return possibility;
case 2:
composition.add(1);
composition.add(1);
possibility.add(composition);
return possibility;
default:
for (int i = 1; i <= n / 2; i++) {
composition = new Composition();
composition.add(i);
composition.add(n - i);
possibility.add(composition);
if (i <= n - i) {
Set partial_pos = calc(n - i);
for (Composition pos : partial_pos) {
pos.add(i);
possibility.add(pos);
}
}
}
return possibility;
}
}public static String toStr(Set possibility) {
String str = "total : " + possibility.size() + “\n”;
for (Composition pos : possibility)
str += toStr(pos);
return str;
}public static String toStr(Composition composition) {
String str = composition.get(0) + “”;
for (int i = 1; i < composition.size(); i++)
str += (" + " + composition.get(i));
str += “\n”;
return str;
}
}
package com.twelve.test;
import java.util.ArrayList;
import java.util.Collections;
/**
-
@author 武
*2019年7月18日15:47:27
*/
public class Composition extends ArrayList {
@Override
public boolean equals(Object other) {
Composition comp = (Composition) other;
Collections.sort(this);
Collections.sort(comp);
if (this.isEmpty() || comp.isEmpty() || this.size() != comp.size())
return false;
for (int i = 0; i < this.size(); i++) {
if (this.get(i) != comp.get(i))
return false;
}
return true;
}@Override
public int hashCode() {
return 0;
}
}
++++++++++++++++++++++++++++++++++++++++++++++++++++++++
此上该程序已写完。
方法二:
下面试刚听到例题之后的理解,当然 也可以实现,不过需要修改程序,增加输出即可。此方法比较繁琐,不适用于正式开发程序,望谨记,仅供参考。
package com.twelve.test;
import java.util.Random;
import java.util.Scanner;
/**
-
@author 武 2019年7月18日15:32:00
*/
public class Demo01 {public static int[] getNL(int number, int size, int[] a) {
Random rand = new Random(); a = new int[size]; for (int i = 0; i < size - 1; i++) { int x = rand.nextInt(number);// 10以内,不填值默认为int类型之内 number = number - x; a[i] = x; } a[size - 1] = number;// 最后一个值,应该是前面随机之后,算出来的 return a;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a[] = null;
int b[] = null;
int c[] = null;
int d[] = null;
int number = scanner.nextInt();
int size = scanner.nextInt();
a = getNL(number, size, a);
b = getNL(number, size, b);
for (int i = 0; i < number; i++) {
c = getNL(number, size, c);
d = getNL(number, size, d);
}for (int i : a) { System.out.print(i + "-"); } System.out.println("****"); for (int i : b) { System.out.print(i + "-"); } System.out.println("****"); for (int i : c) { System.out.print(i + "-"); } System.out.println("****"); for (int i : d) { System.out.print(i + "-"); } System.out.println("****");
}
}
控制台可以输出,测试,代码方面仅供参考,所有解释权谨归作者所有。