拼多多笔试,第一题非严格递增数组排序,求解

没有任何复杂的思路,将B数组排序后,从大到小进行替换测试,分别对位置index + 1,index进行替换,有一种情况符合就输出这个数。为什么只有40%的通过率,求大佬答疑!!!
import copy
line1 = input().strip()
line1 = line1.split(" ")
line1 = list(map(int, line1))
line2 = input().strip()
line2 = line2.split(" ")
line2 = list(map(int, line2))
line2.sort()
index = 0
while index < len(line1) - 1:
if line1[index] > line1[index + 1]:
break
index += 1

temp = copy.deepcopy(line1)
index2 = len(line2) - 1
while index2 >= 0:
temp1 = copy.deepcopy(line1)
temp2 = copy.deepcopy(line1)
temp1[index + 1] = line2[index2]
temp2[index] = line2[index2]
sort1 = sorted(temp1)
sort2 = sorted(temp2)
if sort1 == temp1:
for i in temp1:
print(i, end=" ")
break
if sort2 == temp2:
for i in temp2:
print(i, end=" ")
break
index2 -= 1
else:
print("NO")





#拼多多##笔试题目#
全部评论
import java.util.Arrays; import java.util.Scanner; public class Main1 { private static int index = 0; private static int replaceNum; private static int[] A; public static void main(String[] args) { Scanner sc = new Scanner(System.in); String[] arr1 = sc.nextLine().split(" "); String[] arr2 = sc.nextLine().split(" "); if (arr1 == null || arr2 == null || arr1.length == 0 || arr2.length == 0) { System.out.print("NO"); return; } A = new int[arr1.length]; int[] B = new int[arr2.length]; int i = 0; for (String s : arr1) { A[i++] = Integer.parseInt(s); } i = 0; for (String s : arr2) { B[i++] = Integer.parseInt(s); } findInA(A); Arrays.sort(B); if(findInB(B, index)) { //替换index的值 只能AC70% A[index] = replaceNum; } else if (findInB(B, index - 1)) { //考虑替换index-1的值 A[index - 1] = replaceNum; } if (isSorted(A)) { printArray(A); } else { System.out.print("NO"); } sc.close(); return; } private static void printArray(int[] a) { for (int i = 0; i < a.length; i++) { if (i != a.length - 1) System.out.print(a[i] + " "); else System.out.print(a[i]); } } private static boolean isSorted(int[] newA) { for (int i = 1; i < newA.length; i++) { if (newA[i] <= newA[i - 1]) { return false; } } return true; } private static boolean findInB(int[] b, int index) { int res = Integer.MIN_VALUE; for (int num : b) { if (index >= 1) { if (num > A[index - 1] && num < A[index + 1]) { res = Math.max(res, num); } } else if (index == 0) { if (num < A[index + 1]) { res = Math.max(res, num); } } } boolean result = res == Integer.MIN_VALUE ? false : true; if (result) { replaceNum = res; } return result; } private static void findInA(int[] a) { for (int i = 1; i < a.length; i++) { if (a[i - 1] >= a[i]) { index = i; } } } }
点赞 回复 分享
发布于 2019-07-28 23:05
int main() {     vector<int> a;     a.push_back(0x80000000);     vector<int> b;     char c;     int num;     while ((c = getchar()) != '\n')     {         if (c != ' ')         {             ungetc(c, stdin);             cin >> num;             a.push_back(num);         }     }     a.push_back(0x7FFFFFFF);     while ((c = getchar()) != '\n')     {         if (c != ' ')         {             ungetc(c, stdin);             cin >> num;             b.push_back(num);         }     }     int index = 0;     for (int i = a.size()-1; i>0; i--)     {         if (a[i] <= a[i - 1] && a[i] <= a[i + 1])         {             index = i;             break;         }     }     int max = 0x80000000;     //在b中查找     for (int i = 0; i < b.size(); i++)     {         if (b[i] > a[index-1]&&b[i]<a[index+1]&&b[i]>max)             max = b[i];     }     if (max == 0x80000000)         cout << "NO" << endl;     else     {         a[index] = max;         for (int i = 1; i < a.size()-1; i++)             cout << a[i] << " ";     }     return 0; }
点赞 回复 分享
发布于 2019-07-28 18:33
我是设max初始为Integer.MAX_Value,min为Integer.MIN_Value,找到a[i]>=a[i+1]的位置,然后如果i>0那么min=a[i-1],如果i+2<数组length那么max=a[i+2]。然后b从大到小遍历,找出一个数大于a[i]且小于max,或者大于min且小于a[i+1]。
点赞 回复 分享
发布于 2019-07-28 17:51
你的index就错了,leetcode上有个类似的题,替换位置有两种情况,应该维护两个备选位置,写起来比较复杂
点赞 回复 分享
发布于 2019-07-28 17:48
感觉思路很好想,但是***写的太暴力 TLE 了。。 可能因为我每次用一个数替换index或者index+1之后我都遍历一遍a数组(n个)判断数组的严格升序了?也就是O(2*MN)太慢了?
点赞 回复 分享
发布于 2019-07-29 10:38
还需要选的数是最大啊
点赞 回复 分享
发布于 2019-07-28 17:38
mark
点赞 回复 分享
发布于 2019-07-28 17:38
我没考虑替换index为啥能过70%。。。
点赞 回复 分享
发布于 2019-07-28 17:36

相关推荐

非常好的面试官非常差的我1h17minc++经典三大特性虚函数内存对齐(当时背八股明明看到有的,结果没认真看😭)数据类型的字节大小(那这个反驳我上面的错误😭)匿名函数左值右值其他忘了,考的挺多,因为我简历太简单了图形学:mvp矩阵的vp矩阵的推导(我真是太怠惰😭)相机与观察矩阵的关系(其实就是逆,我想太多了)纹理过滤pbr延迟着色ssao&nbsp;blur是为啥高斯模糊帧缓冲纹理格式泛光伽马校正shadowmap的锯齿解决(bias)各个测试应该要在什么时候进行在我的项目中又该是什么时候进行ibl立方体贴图抗锯齿(故意没考,估计看出来我准备了这个)mipmaphdrps:不要觉得就知道个概念就行,一定要深挖其内涵,鼠鼠第一次面试被拷打晕过去了要场景题:实现反射,只用两次渲染得到所需贴图,不能是立方体贴图(本来想考ssr的看我不会)结合我的项目对整个延迟渲染管线拷打算法题:两道e口述链表环连续子字符串反问:q:我是第一次面试,请问您对我的建议:a:乍一看基础还行,其实经不住深挖,简历太简单没啥好问的所以只能散着问问,多增加自己的经历吧q:我知道我这次面的很差,如果这次面试挂了,您觉得我是进老师实验室实习好还是继续找实习好a:如果你要读研读博的话,还是去老师实验室好,实习只是一段增长你见识的经历,如果就业的话还是实习好,你们学校挺多大二就实习的q:那您觉得以我当前的水平和简历能找到实习吗a:丰富下简历,有些公司比较闲会给些简单任务给你,还是有机会的结束😭无论结果如何,我都非常感谢这个公司给了我这么一次机会,也非常感谢面试官这样把我的盲区揪出来(小插曲:这个面试我太笨了居然约了hr找我一天之后,真的打了我个措手不及,24小时只睡了5小时吃了1小时,其他时间完全复习,再也不这么匆忙了)
点赞 评论 收藏
分享
评论
点赞
16
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务