拼多多8.25笔试
a了3.6 四道贪心
第一题先用并查集求初始联通块数,最后排序边权从小到大删边,维护最大值
第二题先判断数组中奇数的个数,如果存在奇数,剩下的偶数都进行两个数求和操作,如果不存在奇数,就在所有偶数中选减半次数最小的先变为奇数,其他偶数进行两个数求和操作
第三题直接从后往前遍历模拟替换,可以过60%
第四题把字符串看成一个循环字符串,直接从头开始遍历,维护01字符串的长度就可以了。
有佬有第三题的思路吗?
第一题先用并查集求初始联通块数,最后排序边权从小到大删边,维护最大值
第二题先判断数组中奇数的个数,如果存在奇数,剩下的偶数都进行两个数求和操作,如果不存在奇数,就在所有偶数中选减半次数最小的先变为奇数,其他偶数进行两个数求和操作
第三题直接从后往前遍历模拟替换,可以过60%
第四题把字符串看成一个循环字符串,直接从头开始遍历,维护01字符串的长度就可以了。
有佬有第三题的思路吗?
全部评论
第三题为什么我只过了20%呀
第三题需要考虑不需要替换的情况 例如 2 3 4 8,手上的是7,那就不需要再替换了
第三题先从前面找到排序好的位置做个标记,然后再从后面替换往前替换到标记的位置,最后再从头检查是不是非递减即可。
tql,哥,谢谢了
大佬,请问一下第二题,如果存在奇数,剩下的偶数进行求和操作不还是偶数吗?为啥这样做步数是最少的呀?
怎么找减半次数最少的偶数呢,我排序后用第一个偶数老是超时
佬们没参加笔试 这个对不 int num = 0;
int start = arr.length - 1;
for(;start > 0;) {
int c = start;
do{
c--;
if(c == 0) break;
} while (arr[c] >= arr[c-1]);
//表示有序直接返回
if(c == 0) break;
if(cur >= arr[c] && cur <= arr[c+1]) {
cur = arr[c];
num++;
}else{
while(arr[start] >= cur && start != c){
start--;
}
cur = arr[c];
num += start - c + 1;
}
start = c-1;
}
System.out.println(num);
我想问一下,哥们你笔试过了吗,为什么我笔完了还是待笔试状态
相关推荐
11-22 22:06
门头沟学院 Java 点赞 评论 收藏
分享
10-19 13:10
广西民族大学 直播运营 点赞 评论 收藏
分享