微创软件笔试题

liyanlin122 2010-03-24 07:04:42
求随机数构成的数组中找到长度大于=3的最长的等差数列
输出等差数列由小到大
如果没有符合条件的就输出[0,0]

格式:
输入[1,3,0,5,-1,6]
输出[-1,1,3,5]

要求时间复杂度,空间复杂度尽量小
...全文
449 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
peterhand07 2010-03-25
  • 打赏
  • 举报
回复
哈哈~~看不懂
lzh9955 2010-03-25
  • 打赏
  • 举报
回复
upupup
gbb21 2010-03-25
  • 打赏
  • 举报
回复
Time: O(nlogn)
Space: O(n)

Algo: Sort + DP
lucasma.eth 2010-03-25
  • 打赏
  • 举报
回复
关注中.....
嘎文 2010-03-25
  • 打赏
  • 举报
回复
好家伙,这题不简单,够麻烦的,跟去年的笔试题有的拼
s446721902 2010-03-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 macrojj 的回复:]
额。。。愚见。。

先算两两的差值。
[/Quote]
任意两个的差值都算出来,得到最长的等差数列?
candeabc123 2010-03-25
  • 打赏
  • 举报
回复
等待高手出现
macrojj 2010-03-25
  • 打赏
  • 举报
回复
额。。。愚见。。

先算两两的差值。
yizhe0314 2010-03-25
  • 打赏
  • 举报
回复
数组最大长度没有规定吗?
残念。。。
走好每一步 2010-03-25
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分
knate 2010-03-25
  • 打赏
  • 举报
回复

// 最长等差数列.cpp : 定义控制台应用程序的入口点。
//
//时间和空间复杂度均为 n*n


#include "stdafx.h"

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
#include <ctime>

using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
srand((unsigned int)time(NULL));
vector<int> v;

unsigned int n;
n = 20;

for(unsigned int x = 0;x < n;++x)
v.push_back(rand()%10);

//输入[1,3,0,5,-1,6]
/*
v.push_back(1);
v.push_back(3);
v.push_back(0);
v.push_back(5);
v.push_back(1);
v.push_back(6);
n = v.size();
*/
sort(v.begin(),v.end());
vector<map<int,int> > vDest;
vDest.resize(n);

for(unsigned int x = 1;x < n;++ x){
for(unsigned int i = 0;i < x;++ i){
vDest[x][v[x] - v[i]] = vDest[i][v[x] - v[i]] + 1;
}
}

unsigned int number,tolerance;
unsigned int iLast_Number = 0;
int iLength = 0;
for(unsigned int x = 1; x < n; ++ x){
//int iLength = 0;
for(map<int,int>::iterator p = vDest[x].begin();p != vDest[x].end();++p){
if(iLength < p->second){
number = p->second;
tolerance = p->first;
iLength = p->second;
iLast_Number = x;
}
}
}

cout<<"排序好的数列"<<endl;
for(unsigned int x = 0; x < n;++ x)
cout<<v[x]<<" ";
cout<<endl;
cout<<"最长等差数列"<<number + 1<<" tolerance"<<tolerance<<" 最后的编号(0开始)"<<iLast_Number<<endl;

//cout<<vDest[iLast_Number][tolerance]<<endl;
if(vDest[iLast_Number][tolerance] >= 3 - 1){

int val = v[iLast_Number] - tolerance * number;
for(unsigned int x = 0; x <= number; ++ x){//由于记录number从0开始,后面需要用等于修正
//如果需要如实输出实际记录的数据,则需要n lgn复杂度.
cout<<val<<" ";
val += tolerance;
}
cout<<endl;
}
else{
cout<<"没有符合要求的数据"<<endl;
}
return 0;
}


liyanlin122 2010-03-25
  • 打赏
  • 举报
回复
等待高手出现~~~~
tananade 2010-03-25
  • 打赏
  • 举报
回复
这题不简单
chuengchuenghq 2010-03-25
  • 打赏
  • 举报
回复
这题 有点麻烦
liyanlin122 2010-03-24
  • 打赏
  • 举报
回复
题目指出数组元素为随机数
主要是为了说明数组元素是没有规律的
可以按照事先给定的整数数组等待
liyanlin122 2010-03-24
  • 打赏
  • 举报
回复
问题补充:

有一个数组,数组中的元素是由随机数组成的
求这个数组中的元素构成的等差数列,
要求:
输出这些等差数列中长度>=3的最长的那一个或多个(可能不止1个)
如果没有>=3的等差数列,就输出[0,0]

输出格式为:
例如:数组[-1,1,3,5,4,0]
其中最长的等差数列为-1,1,3,5
因此输出结果为[-1,1,3,5]
ArthurJava 2010-03-24
  • 打赏
  • 举报
回复
题目都看不懂鸟
cy330206 2010-03-24
  • 打赏
  • 举报
回复
占个位子
cy330206 2010-03-24
  • 打赏
  • 举报
回复
占个位子
ShineShineRedStar 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gigglesun 的回复:]

随机数构成的数组长度固定为6?
[/Quote]楼主只是举个例子吧
加载更多回复(1)

64,653

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧