Google2012面试题

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数组。


用一个数组记录当前index内的元素single length,然后再记录double length,如果index+1跟index一样,single++,double++,如果index跟另外一个相同,single=1,double++,如果跟前面两个都不一样,double=single+1,single=1。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值