日期:2014-05-17 浏览次数:20894 次
class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(getLevel(3));
System.out.println(getLevel(53));
System.out.println(getLevel(103));
System.out.println(getLevel(153));
System.out.println(getLevel(203));
}
private static String getLevel(final int x) {
int left = x / 50;
int right = left + 1;
return "[" + (left * 50 + 1) + ", " + right * 50 + "]";
}
}
// result:
// [1, 50]
// [51, 100]
// [101, 150]
// [151, 200]
// [201, 250]
------解决方案--------------------
还是不太明白LZ你的要求,LZ要求每个级别包含的元素是50的倍数,还是说之要求最大的是50的倍数?
即
第1级是 1-50
第2级是 51-2500(这样的话,51-2500只有2450个元素,最大的2500是50的倍数) --A
还是说
第2级是 51-2550(也就是说第2级有2500个元素,也就是说元素的个数是50的倍数) --B
16L的代码是 --B 的情况
如果是--A情况,改下代码就可以了
给LZ写了段测试代码
import java.util.*;
public class Test {
static TreeMap<Integer, Integer> map = new TreeMap<Integer, Integer>();
static { //因为map信息是重复使用的,所以把16L的map部分抽出来
int sum = 0, times = 50;
for (int i=0; i<5; i++) {
map.put(sum, i+1);
sum = (sum == 0 ? times : sum*times);
}
}
public static void main(String[] args) throws Throwable {
for (int i=0, j=1; i<5; i++, j*=50) {
System.out.printf("边界测试当前分数:分数=%d, 级别=%d\n", j, getLevel(j));
System.out.printf("边界测试下个分数:分数=%d, 级别=%d\n", j+1, getLevel(j+1));
int k = (int)(Math.random()*j);
System.out.printf("随机测试:分数=%d, 级别=%d\n", k, getLevel(k));
System.out.println();
}
Scanner sc = new Scanner(System.in);
System.out.print("请输入一个[1-312500000]范围内的整数:");
int score = sc.nextInt();
System.out.printf("输入的分数为:%d, 该分数对应的等级为:%d\n", score, getLevel(score));
}
public static int getLevel(int score) {
if (score < 1 || score > 312500000) return -1; //超出范围
return map.lowerEntry(score).getValue().intValue();
}
}
------解决方案--------------------
昨晚忘了贴代码了。大致的思路是这样的。
public class Test{
public static void main(){
getQUJIAN(1);
}
public static int[] getQUJIAN(int data){
int start;
int end;
start = end = 0;
int lev = getLev(data);
if(lev==5){
start = end = data;
return new int[]{start,end};
}
else{
start =(int)(data * Math.pow(5-lev)) + 1;
end = start +(int)Math.pow(5-lev) - 1;
return new int[]{start,end};
}
}
public static int getLev(int data){
int lev = 1;
if(data > Math.pow(50,lev)){
data = data - (int)Math.pow(50,lev);
lev++;
}
if(lev > 5){
throw new RuntimeException();
}
}
}