1. 区间合并。比如[1, 3], [4, 9], [2, 3.5]合并成[1, 3.5], [4,9]
同学写的代码
#include <algorithm>
#include <utility>
#include <vector>
using namespace std;
bool cmp( pair<double, double> a, pair< double, double> b )
{
return a.first < b.first;
}
vector< pair<double, double> > lineMerge(vector<double> left, vector<double> right)
{
vector< pair<double,double> > line;
for( int i = 0; i < left.size(); i++ )
line.push_back( make_pair( left[i], right[i]) );
sort( line.begin(), line.end(), cmp );
vector< pair<double,double> > ret;
double preleft;
double preright;
for( int i = 0; i < line.size(); i++)
{
if( i== 0 )
{
preleft = line[i].first;
preright = line[i].second;
}
else
{
if( line[i].first > preright )
{
ret.push_back( make_pair( preleft, preright) );
preleft = line[i].first;
preright = line[i].second;
}
else
preright = max( preright, line[i].second );
}
}
ret.push_back( make_pair( preleft, preright) );
return ret;
}
2. 求一个分数的小数表示,用字符串表示。比如1/8表示成0.125,1/3表示成0.[3] []表示循环节
同学写的代码
#include <iostream>
#include <string>
#include <sstream>
#include <map>
using namespace std;
string f(int a, int b)
{
stringstream s;
int c = a/b;
a = a - c*b;
s<<c;
string base = "";
s>>base;
if( a == 0 )
return base;
a = a*10;
string follow = "";
map<int,int> used;
int l = 0;
while( used.find(a)==used.end() && a!=0)
{
int now = a/b;
follow = follow + char('0'+now);
used[a] = l;
a = a - now*b;
a = a*10;
l++;
}
if( a!=0 )
{
follow = follow.substr(0,used[a]) + "[" + follow.substr(used[a]) + "]";
}
return base+"."+follow;
}
int main()
{
cout<<f(3312,315);
}
3. 有大小N的数组,数组中的数字都是[1,N]大小的,找出1到N中不在数组中的那些数字,时间要求O(N),空间要求O(1)
水木上有这道题目,不过没要求找出那些数
☆─────────────────────────────────────☆
zhuzhu2005 (永恒的猪肉卷) 于 (Fri Jul 20 14:04:24 2012) 在
【整形数组,判断元素是否仅出现一次】 的大作中提到:
给定一个整形数组,长度为N。
若元素范围为0到N-1且每个元素仅出现一次,则返回valid,否则返回invalid。
要求时间复杂度O(n),空间复杂度O(1)。
☆─────────────────────────────────────☆
lvhu (~~~) 于 (Fri Jul 20 16:04:21 2012) 在
【Re: 整形数组,判断元素是否仅出现一次】 的大作中提到:
执行一遍O(n)的排序即可,这个数组比较特殊,值和下标可以一一对应。
排序的规则是i从0-n-1,一直找a[i] 和i对不上的,直到a[i] == i,时间复杂度为O(n),中间需要加上判断,是否有重复的。
int cnt, i, temp;
cnt = 0;
i = 0;
while(cnt++ < 2*N && i < N)
{
if(a[i] < 0 || a[i] >= N)
{
return 0;
}
if(a[i] != i)
{
temp = a[a[i]];
a[a[i]] = a[i];
a[i] = temp;
}
else
{
i++;
continue;
}
}
return i == N-1 && a[N-1] == N-1;
4. Find the longest 2-character substring Example: "ababcbcbaaabbdef" baaabb
听同学讲了一个大概思路,记录两个字母,一个single length和一个double length数组。