满帮笔试9月6日
选择题25道,50分
选择题不容易做,乱七八糟什么都有考。
编程题2道,50分
第一道题:
给一个字符串"133333", 问1后面有几个3?
如果“1”则返回-1,如果1后面有不为3的其他数字,也返回-1
测试用例:注意,如果是“23333”这样的用例也返回-1。
第二道题:
题目是,给出一个数组,保存学生的分数,其中可以1人分1组,2人分1组,只要满足两个人中分数差距在20分之内;3人分一组,三人中最大差距在10分之内。
解法:考虑用递归的方式求解,最后过了96%的用例,还有点是超时了,递归的老毛病了,剪枝技术又没想出来啊哈哈。
import java.util.Scanner;
import java.util.*;
public class Main {
//突然想到了,如果用个记忆数组,应该能过,Map<Integer,Integer>,其中key保存begin的位置
public static int split(int[]nums, int begin){
if(nums.length<1) return 0;
if(begin>=nums.length){
return 0;
}
if(nums.length-begin==1){
return 1;
}
//只有两个学生的情况
if(nums.length-begin==2){
if(Math.abs(nums[begin]-nums[begin+1])<=20){
return 1;
}else{
return 2;
}
}
//?
if(nums.length-begin==3){
if(Math.abs(nums[begin]-nums[begin+2])<=10){
return 1;
}else if(Math.abs(nums[begin]-nums[begin+1])<=20 ||
Math.abs(nums[begin+1]-nums[begin+2])<=20){
return 2;
}else{
return 3;
}
}
//有三个及其以上的学生,
int one = 1+split(nums, begin+1);
int two = Integer.MAX_VALUE;
if(Math.abs(nums[begin+1]-nums[begin])<=20){
two = 1+split(nums, begin+2);
}
int three = Integer.MAX_VALUE;
if(Math.abs(nums[begin+2]-nums[begin])<=10){
three = 1+split(nums, begin+3);
}
int res = Math.min(Math.min(one, two), three);;
// int[] score = {100,110,120,140,160,180};
System.out.println("begin:"+begin+":::"+one+","+two+","+three);
return res;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] score = new int[n];
for(int i=0;i<n;i++){
score[i] = in.nextInt();
}
//
Arrays.sort(score);
int sp_n = split(score,0);
System.out.println(sp_n);
}
} #满帮#
查看28道真题和解析