这是我参与8月更文挑战的第24天,活动详情查看:8月更文挑战
乐鑫01. 录取分数线
思路分析
有点犯懒了,最开始其实知道排个序再直接返回就可以了,但是选择用两个for循环解决问题,最开始以为只需要
for(int j = 0; j < scores.size(); j++){
if (scores[i] <= scores[j]){
ret++;
}
}
if(ret == k){
return scores[i];
}
但是后来发现并不能解决成绩重复导致计算排名偏大,但是我们可以用
for(int j = 0; j < scores.size(); j++){
if (scores[i] < scores[j]){
cot++;
}
}
这种方式计算出计算排名偏小的结果,如果k在cot和ret的范围之间,那么即返回这个score。
(后来发现超时了,所以建议还是老老实实排个序。)
乐鑫03. 签到序列
思路分析
这道题看起来是有规律的,因为1-9 共有9个数,每个数字一位,10-99, 共有90个数,每个数字两位,100-999, 共有900个数,每个数字3位。
因此可以用这种方式判断 对于第i组 共有9 * 个数,每个数字i位,本组共有 9 * i *
那么对于前i组,则第一层有9个,第二层有99个,第三层有999个,第i层有 - 1 个,因此可以用循环的方式迅速确定这个k在第几组。
确定组号后,通过k/i找到是本组的第几个数字(如果不能整除,则舍弃小数点后面的位,当然了int本身除法也是这个效果),通过k%i找到是本组的第k/i个数字的第几位。
int getKthNum(long k) {
for (int i = 1;; i++) {
if (i * pow(10, i) > k) {
return to_string(k / i)[k % i] - '0';
}
k += pow(10, i);
}
}