最近几个公司的笔试题

(1)RGB排序,一个字符串,里面只有三种字符R G B,所有的R都在G的前面,所有的G都在B的前面。将给定字符串按照此规律排序。要求不允许用辅助空间,复杂度控制在O(N)。遍历一遍就排好序。

这道题有些不好搞,想着用快排达不到O(n)
思路只有遍历 ,然后利用已经得到的结果处理 还要思考啊~

想了一下,快排的话 取前k个最小值的话,从期望的角度考虑可以达到o(n)
因此我考虑从快排入手 ,只将比G小的放到G之前,将比G大的放在其后。
代码如下
#include "stdio.h"
#include "string.h"
#include <algorithm>
#include <iostream>
using namespace std;
#define MAX 1024
int cmp(char c,char d)
{
	int ret=0;

	if(c=='B')
	{
		(d=='B')?ret=0:ret=1;
	}
	else if(c=='G')
	{
		d=='R'?ret=1:(d=='G')?ret=0:ret=-1 ;
	}
	else if(c=='R')
	{
		d=='R'?ret=0:ret=-1;
	}
	return ret;
}
int Partion(char *str,int s,int e)
{
	int i=s-1;
	int j;
	for(j=s;j<e;j++)
	{
		if(cmp(str[j],str[e])<0)
		{
			swap(str[i+1],str[j]);
			i+=1;
		}
	}
	swap(str[i+1],str[e]);
	return i+1;
}
int quickSort(char *str,int s,int e)
{
	int p=0;
	if(s<e)
	{
		p = Partion(str,s,e);
	
	}
	return p;
}


int main()
{
	char str[MAX];
	int i=0;
	int len =0;
	int p;
	scanf("%s",str);
	len = strlen(str);
	for(i=0;i<len;i++)
	{
		if(str[i]=='G')
			break;
	}
	swap(str[i],str[len-1]);
	/*至于判断是否有G或者B这里省去了,直接考虑包含RGB的情况*/
	p = quickSort(str,0,len-1);
	for(i=p+1;i<len;i++)
	{
		if(str[i]=='B')
			break;
	}
	swap(str[i],str[len-1]);
	p = quickSort(str,p+1,len-1);
	cout<<str<<endl;
	return 0;
}
不知道还有没有好的方法来解决这个问题!求指导!

(2)句子翻转

i am superman ---> superman am i

答案:这个简单 做了很多遍了,amazon笔试题里面写过,先每个单词转,后整个转


(1)判断两个Query是否相同北京欢迎你你欢迎北京

答案:搜索引擎会对其进行分词,一般为 北京/欢迎/你  你/欢迎/北京

           只有判断句子是否相同,这个不太清楚

(2)最长前缀子串问题

a="abdcdef"   b="dex"   则最长子串是de

 答案:这种情况下对a建立后缀数组,然后查找b的最长前缀匹配


(3)某数据库应用,大量的插入和查询,查询速度只有10/秒,请问:问题可能在哪里?

答案:应该是索引没有,或是索引建的不好

(4)中国到香港搭了一个10G的私有光线,单进程传输速度只有1,2M,请问:问题可能出在哪里?

答案:(待研究)应该是服务器 到客户端 这里的流量不够吧。

(5)有个Sequence,形如:S[]={a,b,...z,aa,ab,...az,ba,bb,...bz,...aaa,aab,...aaz,...}

给定一个字符串,查找在不在Sequence里,位置是多少?

答案:也就是一个26进制的处理吧,二分查找吧


(1)区间序列 (2,3) (4.2,6) (7,9)判断给定的一个区间与上面哪些区间有交集,比如给定(4,5)则输出(4.2,6)

答案:并查集解决吧,真的每个区间的点 建立祖先,然后判断是否祖先相同就行了


(2)两个有序数组,A[k]B[k]长度都为k。求前k个最小的(a[i]+b[j])

答案:去A[0]+B[0]作为第一个,然后A和B分别取后一个减前一个差值最小的那一边


1,strcmp函数实现。

2,判断大段小段模式。

3,有序链表的创建。


系统设计题:

大图导航系统:

(1)现有大图1W张,像素:1024*4096。系统可以增加或者删除图片。

(2)手机屏幕分辨率240*320.内存16M,手机本地存储256M。只能显示图片局部,用户左右移动来查看大图的其他部分。

(3)若干台PC机,内存4G,硬盘800G,双核CPU

问题:逻辑结构图,模块划分?模块间的关系,为何这么划分,原因是?

问题:如果大图数量增加,安装该应用的手机客户端增加,会带来哪些问题,怎么解决?

程序设计题:

一棵树,每个节点保存一个数字,找两个相同的节点(所谓相同的节点是指,两个节点的值相同,并且它们的子结构也要相同,就是以他俩为跟的那两颗子树也要一模一样。)

答案:递归吧

一个平面,上有n个点,点与点之间可能有连接,判断这里是否有环路。

答案:这个也可以并查集吧,公共祖先的祖先是其孩子 就可能环路吧





评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值