题目是:
有一个无序数组,然后另外给定一个值n,输出数组中 相加大于n的 最少元素个数。
如数组为[2,4,4,7,7,8,9] ,n值为11,那8+9>11,最终结果为2.
package com.other;
import java.util.ArrayList;
import java.util.List;
/**
* 一个无序数组,给定一个n,输出数组中 相加大于n的 最少元素个数
*
* @author kimtian
*/
public class Main {
public static void main(String[] args) {
Main main = new Main();
int a[] = main.getArray();
int length = a.length;
/**
* 将生成的数组进行快速排序
**/
main.fastSort(a);
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + ",");
}
/**
* 生成一个值为1000以内的随机数n
*/
int n = (int) (Math.random() * 30);
System.out.println();
System.out.println("n值为:" + n);
int sum = 0;
/**
* 因为我排序选的是从小到大,所以从最大值最后一个开始取,和n相比,再用数组长度-i,即为相加超过n值的最少个数
**/
for (int i = length - 1; i >= 0; i--) {
sum += a[i];
if (sum >= n) {
System.out.println("结果:" + (length - i));
break;
}
if (i == 0 && sum < n) {
System.out.println("数组中有" + length + "个元素,全部元素相加之和为" + sum + "。无法大于n值。");
}
}
}
public int[] getArray() {
/**
* 生成一个长度100以内随机,
* 值为100以内随机数的数组
*/
List<Integer> numList = new ArrayList();
int length = (int) (Math.random() * 10);
while(length==0){
length = (int) (Math.random() * 10);
}
System.out.println("数组长度为:" + length);
System.out.println();
for (int i = 0; i < length; i++) {
numList.add((int) (Math.random() * 10));
}
int a[] = new int[length];
//将list的值放到数组中
if (numList != null && numList.size() > 0) {
for (int i = 0; i < length; i++) {
a[i] = numList.get(i);
}
}
return a;
}
/**
* 快速排序
*
* @param a 数组
*/
public void fastSort(int a[]) {
sort(a, 0, a.length - 1);
}
public static void sort(int a[], int low, int hight) {
int i, j, index;
if (low > hight) {
return;
}
i = low;
j = hight;
index = a[i];
while (i < j) {
while (i < j && a[j] >= index) {
j--;
}
if (i < j) {
a[i++] = a[j];
}
while (i < j && a[i] < index) {
i++;
}
if (i < j) {
a[j--] = a[i];
}
}
a[i] = index;
sort(a, low, i - 1);
sort(a, i + 1, hight);
}
}