华为OD机试 - 荒岛求生 - 栈Stack(Python/JS/C/C++ 新系统 100分)

华为OD机试 - 荒岛求生 - 栈Stack(Python/JS/C/C++ 新系统 100分) 华为OD机试 双机位C卷题库疯狂收录中刷题点这里专栏导读本专栏收录于《华为OD机试真题Python/JS/C/C》。刷的越多抽中的概率越大私信哪吒备注华为OD加入华为OD刷题交流群每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景发现新题目随时更新。一、题目描述有一个荒岛只有左右两个港口只有一座桥连接这两个港口现在有一群人需要从两个港口逃生有的人往右逃生有的往左逃生如果两个人相遇则PK体力值大的能够打赢体力值小的体力值相同则同归于尽赢的人才能继续往前逃生并较少相应地体力。二、输入描述一行非0整数用空格隔开正数代表向右逃生负数代表向左逃生。三、输出描述最终能够逃生的人数。四、解题思路题意是这样的体力值大的能够打赢体力值小的体力值相同则同归于尽赢的人才能继续往前逃生并较少相应地体力。正数代表向右逃生负数代表向左逃生。那就将正数加到一个集合里负数加到一个集合里然后开始遍历取值体力值大的能够打赢体力值小的并较少相应地体力体力值相同则同归于尽最后输出正数集合和负数集合的大小之和最终能够逃生的人数五、效果展示1、输入10 20 -20 -5 102、输出23、说明正数集合10 20 10负数集合 -20 -520和-20同归于尽10和-5抵消5体力值最终能够逃生的人数2人。六、Python算法源码defmain():# 读取一行输入包含非0整数用空格隔开numslist(map(int,input().strip().split()))# 正数栈positive_stack[]# 负数栈negative_stack[]fornuminnums:ifnum0:# 正数直接入栈positive_stack.append(num)else:# 负数代表向左逃生remain_numabs(num)whilepositive_stack:positive_toppositive_stack[-1]ifremain_numpositive_top:# 消除当前的正数还可以继续碰撞remain_num-positive_top positive_stack.pop()elifremain_numpositive_top:# 消除当前的正数然后修改top值modify_numpositive_top-remain_num positive_stack.pop()positive_stack.append(modify_num)remain_num0breakelse:# 相等同归于尽positive_stack.pop()remain_num0# 被消除了break# 如果还活着负数入负数栈ifremain_num0:negative_stack.append(-remain_num)print(len(positive_stack)len(negative_stack))if__name____main__:main()七、JavaScript算法源码functionmain(){constinputrequire(readline-sync);// 读取一行输入包含非0整数用空格隔开constnumsinput.question().trim().split( ).map(Number);// 正数栈constpositiveStack[];// 负数栈constnegativeStack[];nums.forEach(num{if(num0){// 正数直接入栈positiveStack.push(num);}else{// 负数代表向左逃生letremainNumMath.abs(num);while(positiveStack.length0){constpositiveToppositiveStack[positiveStack.length-1];if(remainNumpositiveTop){// 消除当前的正数还可以继续碰撞remainNum-positiveTop;positiveStack.pop();}elseif(remainNumpositiveTop){// 消除当前的正数然后修改top值constmodifyNumpositiveTop-remainNum;positiveStack.pop();positiveStack.push(modifyNum);remainNum0;break;}else{// 相等同归于尽positiveStack.pop();remainNum0;// 被消除了break;}}// 如果还活着负数入负数栈if(remainNum0){negativeStack.push(-remainNum);}}});console.log(positiveStack.lengthnegativeStack.length);}// 运行主函数main();八、C算法源码#includestdio.h#includestdlib.h#includestring.h#defineMAX_NUMS1000voidpush(intstack[],int*top,intvalue){stack[(*top)]value;}intpop(intstack[],int*top){returnstack[(*top)--];}intpeek(intstack[],inttop){returnstack[top];}intis_empty(inttop){returntop-1;}intmain(){charinput[10000];intnums[MAX_NUMS];intnums_count0;// 读取一行输入fgets(input,sizeof(input),stdin);// 使用空格分割输入并转换为整数char*tokenstrtok(input, );while(token!NULL){nums[nums_count]atoi(token);tokenstrtok(NULL, );}intpositive_stack[MAX_NUMS];intnegative_stack[MAX_NUMS];intpos_top-1;intneg_top-1;for(inti0;inums_count;i){intnumnums[i];if(num0){// 正数直接入栈push(positive_stack,pos_top,num);}else{// 负数代表向左逃生intremain_numabs(num);while(!is_empty(pos_top)){intpositive_toppeek(positive_stack,pos_top);if(remain_numpositive_top){// 消除当前的正数还可以继续碰撞remain_num-positive_top;pop(positive_stack,pos_top);}elseif(remain_numpositive_top){// 消除当前的正数然后修改top值intmodify_numpositive_top-remain_num;pop(positive_stack,pos_top);push(positive_stack,pos_top,modify_num);remain_num0;break;}else{// 相等同归于尽pop(positive_stack,pos_top);remain_num0;// 被消除了break;}}// 如果还活着负数入负数栈if(remain_num0){push(negative_stack,neg_top,-remain_num);}}}// 输出剩余的元素数量printf(%d\n,pos_top1neg_top1);return0;}九、C算法源码#includeiostream#includevector#includestack#includecstdlib#includesstreamusingnamespacestd;intmain(){string input;// 读取一行输入包含非0整数用空格隔开getline(cin,input);// 使用stringstream来处理输入的分割和转换stringstreamss(input);intnum;vectorintnums;// 将输入字符串转换为整数数组while(ssnum){nums.push_back(num);}// 正数栈stackintpositiveStack;// 负数栈stackintnegativeStack;for(intnum:nums){if(num0){// 正数直接入栈positiveStack.push(num);}else{// 负数代表向左逃生intremainNumabs(num);while(!positiveStack.empty()){intpositiveToppositiveStack.top();if(remainNumpositiveTop){// 消除当前的正数还可以继续碰撞remainNum-positiveTop;positiveStack.pop();}elseif(remainNumpositiveTop){// 消除当前的正数然后修改top值intmodifyNumpositiveTop-remainNum;positiveStack.pop();positiveStack.push(modifyNum);remainNum0;break;}else{// 相等同归于尽positiveStack.pop();remainNum0;// 被消除了break;}}// 如果还活着负数入负数栈if(remainNum0){negativeStack.push(-remainNum);}}}// 输出剩余的元素数量coutpositiveStack.size()negativeStack.size()endl;return0;}下一篇华为OD机试真题 - 简易内存池Python/JS/C/C 新系统 200分本文收录于华为OD机试真题Python/JS/C/C刷的越多抽中的概率越大私信哪吒备注华为OD加入华为OD刷题交流群每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景发现新题目随时更新。