力扣周赛乐鑫专场(上)

228 阅读1分钟

这是我参与8月更文挑战的第24天,活动详情查看:8月更文挑战

乐鑫01. 录取分数线

截屏2021-08-24 下午10.34.14.png

思路分析

有点犯懒了,最开始其实知道排个序再直接返回就可以了,但是选择用两个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. 签到序列

截屏2021-08-24 下午11.18.15.png

思路分析

这道题看起来是有规律的,因为1-9 共有9个数,每个数字一位,10-99, 共有90个数,每个数字两位,100-999, 共有900个数,每个数字3位。

因此可以用这种方式判断 对于第i组 共有9 * 10i110^{i-1}个数,每个数字i位,本组共有 9 * i * 10i110^{i-1}

那么对于前i组,则第一层有9个,第二层有99个,第三层有999个,第i层有10i10^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); 
     } 
}