今天网易笔试编程题第三题 回文数组谁能讲一下吗

有一点思路,最后只通过了50%,我是用的递归解的,效率很低。还有,其实我大概知道另外50%测试用例为什么没有过,但是当我加上那段代码的时候,就超时了,不加就不超时。~~~
有谁能够分享下代码吗?
全部评论
我的思路是: 1、比较第一个元素first和最后一个元素end,如果两个数相同,则把他们从数组中移除,否则2)或3)。如果还有剩余的元素,继续1) 2、如果第一个元素小于最后一个元素(first < end),则第一个元素加第二个元素的结果成为第一个元素(记一次加法),继续1) 3、如果第一个元素大于最后一个元素(first > end),则最后一个元素与倒数第二个元素的结果称为最后一个元素(记一次加法),继续1) 当然其实这里说的移除元素,不是真的从集合中移除,因为那样很慢,可以使用两个下标来控制数组的有效范围即可
点赞 回复 分享
发布于 2016-09-12 20:43
#include <iostream> #include <vector> using namespace std; int main() { int n; int i, start, end, count; while (cin >> n) { vector<int> alldata(n); for (i = 0; i < n; i++) { cin >> alldata[i]; } start = 0; end = n-1; count = 0; while (start <= end) { if (alldata[start] < alldata[end]) { alldata[start+1] += alldata[start]; start++; count++; } else if (alldata[start] == alldata[end]) { start++; end--; } else { alldata[end-1] += alldata[end]; end--; count++; } } cout << count << endl; } return 0; }
点赞 回复 分享
发布于 2016-09-12 20:35
#include "bits/stdc++.h" using namespace std; int main() { int n; cin>>n; deque<int> q; for(int i=0;i<n;++i) { int t; cin>>t; q.push_back(t); } int count=0; while(q.size()>1) { int f=q.front(); int b=q.back(); if(f==b) { q.pop_front(); q.pop_back(); } else if(f<b) { q.pop_front(); f=f+q.front(); q.pop_front(); q.push_front(f); count++; } else { q.pop_back(); b=b+q.back(); q.pop_back(); q.push_back(b); count++; } } cout<<count<<endl; return 0; }
点赞 回复 分享
发布于 2016-09-12 20:39
你的第二题是不是那个有多少个黑字符串的那个!  'A' 'B' 'C'组合的那个?
点赞 回复 分享
发布于 2016-09-12 20:37
怕递归爆栈,想搞成队列迭代,结果没想出来怎么处理重复项的判断,超内存了。 还不如递归。。
点赞 回复 分享
发布于 2016-09-12 20:36

相关推荐

用户64975461947315:这不很正常吗,2个月开实习证明,这个薪资也还算合理,深圳Java好多150不包吃不包住呢,而且也提前和你说了没有转正机会,现在贼多牛马公司骗你说毕业转正,你辛辛苦苦干了半年拿到毕业证,后面和你说没hc了😂
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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