方法一、容器+类+重写排序
构建num类,用vector保存n个num类,然后重写排序,新手向方法。。。
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;
import java.util.Vector;
public class 数位和_4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
//读取输入的n、m
int n=sc.nextInt();
int m=sc.nextInt();
//特判n=1的情况
if(n==1) {
System.out.println(1);
}
//实例vector容器,元素是num类
Vector<num> nums=new Vector<>();
for(int i=1;i<=n;i++) {
nums.addElement( new num(i,num.test(i)));
}
//重写排序
Collections.sort(nums,new Comparator<num>() {
@Override
public int compare(num o1, num o2) {
// TODO Auto-generated method stub
//如果数位和相等按数值大小排序
if(o1.ans==o2.ans) {
return o1.val>o2.val?1:-1;
}else {
return o1.ans>o2.ans?1:-1;
}
}
});
//vector从第0号元素排序,所以取(m-1)号元素的数值
System.out.println(nums.elementAt(m-1).val);
sc.close();
}
//构建包含数字和数位和的类
static class num{
int val;
int ans;
num(int val,int ans) {
this.val=val;
this.ans=ans;
}
static int test(int val) {
int ans=0;
while(val>0) {
ans+=val%10;
val/=10;
}
return ans;
}
}
}
考前一直在用vector+重写排序,所以考试第一时间想到就是存对应的数值和数位和。考完感觉这种一一映射的关系好像能用哈希表,或者优先队列?然后重写排序的方法肯定不算快?能力有限,感觉有很多优化的方法,请评论区大佬指正。