一道有趣的笔试题目!
2016-08-04 09:43
302 查看
题目描述:有n 个学生排成一排,每个学生有一个能力值(数组a[]),想从这n个学生中按照顺序选取k名学生,要求相邻两个学生的编号的差不超过d,使得这k个学生的能力值乘积最大,返回最大的乘积。
实现代码:import java.util.ArrayList;
import java.util.List;
/**
* Created by Sophia on 2016/8/2.
*/
public class Test {
static int com(int n, int k,int d,int[] a) {
if (n < k || n <= 0 || k <= 0) {
System.out.println("n,k数据输入不合理");
return 0;
}
int[] b = new int[k + 1];
int[] fg = new int[k + 1];
for (int i = 1; i <= k; i++) {
b[i] = i;
fg[i] = i - k + n;
}
List<List<Integer>> comList=new ArrayList<>();
while (true) {
List<Integer> comp=new ArrayList<Integer>();
for (int i = 1; i <= k; i++)
comp.add(b[i]);
comList.add(comp);
if (b[1] == n - k + 1)
break;
for (int i = k; i >= 1; i--) {
if (b[i] < fg[i]) {
b[i]++;
for (int j = i + 1; j <= k; j++)
b[j] = b[j - 1] + 1;
break;
}
}
}
for(int i=0;i<comList.size();i++){
List<Integer> cc=comList.get(i);
for(int j=1;j<cc.size();j++){
if(cc.get(j)-cc.get(j-1)>d){
comList.remove(i);
i=i-1;
break;
}
}
}
System.out.println(comList);
int max=0;
for(int i=0;i<comList.size();i++){
int j=0;
int product=1;
while(j<k){
product=product*a[comList.get(i).get(j)-1];
j++;
}
if(product>max){
max=product;
}
}
return max;
}
实现代码:import java.util.ArrayList;
import java.util.List;
/**
* Created by Sophia on 2016/8/2.
*/
public class Test {
static int com(int n, int k,int d,int[] a) {
if (n < k || n <= 0 || k <= 0) {
System.out.println("n,k数据输入不合理");
return 0;
}
int[] b = new int[k + 1];
int[] fg = new int[k + 1];
for (int i = 1; i <= k; i++) {
b[i] = i;
fg[i] = i - k + n;
}
List<List<Integer>> comList=new ArrayList<>();
while (true) {
List<Integer> comp=new ArrayList<Integer>();
for (int i = 1; i <= k; i++)
comp.add(b[i]);
comList.add(comp);
if (b[1] == n - k + 1)
break;
for (int i = k; i >= 1; i--) {
if (b[i] < fg[i]) {
b[i]++;
for (int j = i + 1; j <= k; j++)
b[j] = b[j - 1] + 1;
break;
}
}
}
for(int i=0;i<comList.size();i++){
List<Integer> cc=comList.get(i);
for(int j=1;j<cc.size();j++){
if(cc.get(j)-cc.get(j-1)>d){
comList.remove(i);
i=i-1;
break;
}
}
}
System.out.println(comList);
int max=0;
for(int i=0;i<comList.size();i++){
int j=0;
int product=1;
while(j<k){
product=product*a[comList.get(i).get(j)-1];
j++;
}
if(product>max){
max=product;
}
}
return max;
}
//测试 public static void main(String[] args) { int n = 5; int k = 3; int d=3; int[] a={1,2,3,4,5}; int max=com(n,k,d,a); System.out.println(max); } }
相关文章推荐
- 自己想的java笔试题
- 常见java笔试-编程题
- JAVA代码查错
- 一著名软件公司的java笔试算法题的答案
- Java程序员笔试必备--Java基本概念
- 字节流与字符流的区别
- 一道java阶乘求和面试题(1! + 2! + 3! +... + 10! )
- 马士兵视频笔试题:用一个程序模拟死锁的问题
- 马士兵视频笔试题:用一个程序模拟死锁的问题
- 左程云代码面试指南:仅使用递归函数和栈实现一个逆序栈
- 网易在线笔试题——java(1)
- java面试笔试
- Eclipse 下的JReble6.3破解版 安装报错问题解决
- Acm 非洲小孩
- 01-搭建java开发环境
- Java IO流(第一讲):I/O概述
- SPRING多个占位符配置文件解析源码研究--转
- 【JVM调优(一)】----JAVA内存模型抽象结构
- Eclipse汉化包安装及错误解决办法
- Java基础学习总结——Java对象的序列化和反序列化