华为OD:堆栈中的剩余数字
按照考试时间,这个题肯定是超时了,自己想着做了下,大意就是找几个下标控制栈的收缩。新的元素加入时,先从栈顶的元素判断,然后在依次累加上前面的,直到找到相等的(这个时候同时修改对应的下标),然后替换(替换成n * 2),然后把要出栈的全部清空为0,后面打印时,倒序打印,不是0的就可以了。c语言真是麻烦,没有封装好的数据结构,有些题就很吃亏,c++都忘得差不多了。答案很粗糙,试了下给的用例,结果是对的,太细的没有再试,大家适当参考。
#include <stdio.h> #include <stdlib.h> //int arr[] = {6,7,8,13,9}; //int arr[] = {5,10,20,50,85,1}; int arr[] = {1,2,5,7,9,1,2,2}; int num = sizeof(arr) / sizeof(arr[0]); int main() { int i = 0; int j = 0; int k = 0; int m = 0; int n = 0; int sum = 0; int flag = 0; i = 0; for (m = 1; m < num;m++) { j = m; k = i; flag = 0; sum = (i == 0 ? arr[0] :arr[i]); printf("sum:%d i:%d arr[%d]=%d k =%d\n",sum, i,m, arr[m],k); //若最新的小于栈顶的元祖,则跳过 if (arr[m] < sum) { i++; continue; } if (arr[m] == sum) { arr[m] = arr[m] * 2; arr[i] = 0; } else { if (i == 0) { i++; } else { while(k--) { if (arr[k] == 0) continue; sum += arr[k]; if (arr[m] < sum) { printf(" bbb sum:%d arr[%d]=%d i=%d",sum,m,arr[m],i); break; } if (arr[m] == sum) { while(k != i) { arr[k++] = 0; } flag = 1; arr[i] = 0; arr[m] = arr[m] * 2; i++; } else { printf(" sum:%d arr[%d]=%d ",sum,m,arr[m]); } } if (flag == 0) i++; } printf("\n"); } } for (i = num -1; i >= 0; i--) { if (arr[i] != 0) printf("%d ", arr[i]); } printf("\n"); return 0; }
}