网易有道笔试题 _2012
n=5:
1 2 9 10 25
4 3 8 11 24
5 6 7 12 23
16 15 14 13 22
17 18 19 20 21
n=6:
1 2 9 10 25 26
4 3 8 11 24 27
5 6 7 12 23 28
16 15 14 13 22 29
17 18 19 20 21 30
36 35 34 33 32 31
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n;
cin>>n;
int i = 0,j = 0;
int num = 1,r = 1;
vector<int> a(n,0);
vector<vector<int>> matrix(n,a);
matrix[0][0] = num++;
while(num < n*n)
{
r++;
j++;
if(num >= n*n) break;
for(int k = 0;k<r;k++){
matrix[i++][j] = num++;
}
i--;
for(int k = 0;k<r-1;k++){
matrix[i][--j] = num++;
}
if(num >= n*n) break;
r++;
i++;
for(int k = 0;k<r;k++){
matrix[i][j++] = num++;
}
j--;
for(int k = 0;k<r-1;k++)
{
matrix[--i][j] = num++;
}
}
for(int i = 0;i<n;i++)
{
for(int j = 0;j<n;j++)
{
cout<<matrix[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
2. 表达式求值,一个字符串只由'+','-',和‘0’-‘9’组成,并且'+','-'只作为二元
运算符。
bool calculate(const char* exp, int &result);
#include<iostream>
#include<string>
using namespace std;
bool calculate(const char* exp, int &result)
{
string str = exp;
string::size_type pos = str.find_first_of("+-"),last_pos = pos;
result -= atoi(str.substr(0,pos).c_str());
while((pos = str.find_first_of("+-",last_pos+1)) != str.npos)
{
string tmp = str.substr(last_pos+1,pos-last_pos-1);
if(str[last_pos]=='+'){
result -= atoi(tmp.c_str());
}else{
result += atoi(tmp.c_str());
}
last_pos = pos;
}
string tmp = str.substr(last_pos+1,str.length()-last_pos-1);
if(str[last_pos]=='+'){
result -= atoi(tmp.c_str());
}else{
result += atoi(tmp.c_str());
}
if(result == 0) return true;
return false;
}
int main()
{
const char* exp = "1+2+3+3-7+20+3+2+1";
int result = 28;
cout<<calculate(exp, result)<<endl;
return 0;
}
1:
36匹马赛跑,跑道同时只能容许6匹马。而且36匹马速度不同,但是每次跑的速度恒定。
问,跑多少次可以选出第一,第二,第三名
答:先对马编号,分为六组,赛六次,得出第一名,在将第一名所在组的第二名,第三名与六个第一名比赛中的二三名一起跑一次,得到最终的二三名。共7次。
2:
给定一个字串X,求它最长字串S,使得S=SR,SR为S的反序,即如果S=abc,则SR=cba
例子:X=abccba,则输出S=abccba
答:找最长回文子串。
1 给定n个整数,求对应的哈夫曼树的高度
答:定一个结构
struct node
{
int value;
int layer;
}
1:先按值快排一下(升序)
2:从后面取出最大的两个node合并,value取二者之和,layer取较大的再加1,与当前层数cur比较
3: 将新节点插入原数组,保持有序
4:转到2,直到所有节点都被合并,cur中的值为树高
数据分析题:
关于广告入口流量多少的分析,说实话这个题倒是不难,可就是题目有点儿没太弄明白……说购物搜索使用者通常的步骤包括:访问首页、搜索、加入对比价、进入某商城,以下为一天内不同广告入口用户浏览次数,根据图表回答下面三个问题,具体的表就画不出来了,就是给了6个广告入口,分别就首页访问次数、搜索次数、查无结果次数、加入对比价次数、进入商城次数,然后三个问题分别是:
1.分析6个不同的广告入口的特点,按照入口的质量排序,并给出排序依据。
2.如果要给某些广告入口增加投入,如何确定给哪个广告入口增加投入。
3.针对以上情况,请给出您的优化网站意见。
产品设计题:
电视产品“导视系统”是一种可以存储12小时内电视节目的系统,共用户使用。
1.针对“导视系统”的用户,分析用户在什么场景下会使用该系统,用户的需求有哪些?
2.针对用户需求,系统提供的功能有哪些?
3.用户通过什么方式与用户交互,用文字加图片描述交互的过程。
以上两题是整套笔试题目中最具有专业性的两道题,也是个人认为出的还不错的两道题。
补码的含义
char类型的取值范围 无符号 有符号
堆排序 复杂度 建堆的复杂度
TCP/UDP 概念 区别
c程序编译错误和链接错误是怎么产生的
多态 虚函数 java和c++的多态有啥区别
KMP算法思想
#include<iostream>
using namespace std;
struct ListNode{
int val;
ListNode* next;
ListNode(int v)
{
val = v;
}
};
ListNode* reverse(ListNode* head){
if(head == NULL) return head;
ListNode* pre = head;
ListNode* next = head->next;
while(next != NULL)
{
head->next = next->next;
next->next = pre;
pre = next;
next = head->next;
}
return pre;
}
int main()
{
ListNode* head = new ListNode(1);
ListNode* old = head;
for(int i = 2;i<6;i++)
{
ListNode* temp = new ListNode(i);
old->next = temp;
old = temp;
}
old->next = NULL;
ListNode* pre = reverse(head);
while(pre != NULL){
cout<<pre->val<<"->";
pre = pre->next;
}
cout<<endl;
return 0;
}
1.填空题:设x可以用n个5和m个7相加表示,x=5n+7m。求x的最小值,即大于等于x的数都可以用5和7表示。
我觉得是25.
假设5n+7m=x;5n'+7m'=x+1;1+5n+7m =5n'+7m' ;找出最小满足条件的n=m=2,此时x=25,之后的26=21+5,27=20+7;28=28;29=14+15,;30;31=21+10;32=25+7;33=28+5;34=14+20;35……等等。个位数为从0——9都可以用5和7的倍数表示,因此最小的x是25。
2.填空题:从坐标原点(0.0)出发,360°都可以行走,每次行走距离为1,求行走两步后离坐标原点距离的期望。邓家超写的是1,走两步,最近走回原点,最远走到距离为2的圆周长上,转变为求这个小圆周上所有点到坐标原点距离的期望,取他们的圆心离坐标原点的值,即为1.
3.填空题:unix操作系统中进程间通讯的四种机制
管道\消息\共享存储区\信号\ 信号量
主要的四个是前4个:
(1)信号是用于通知发生一个进程同步事件的软件机制。信号类似于硬件中断,但没有优先级,即内核平等地对待所有的信号。对于同时发生的信号,一次只给进程一个信号,而没有特别的次序。进程间可以互相发送信号,内核也可以在内部发送信号。信号的传递是通过修改信号要发送到的进程所对应的进程表中的一个域来完成的。由于每个信号只保存为一位,因此不能对给定类型的信号进行排队。只有在进程被唤醒继续运行时,或者进程准备从系统调用中返回时,才处理信号。unix SVR4中定义的信号有:sighup(阻塞;当内核设想该进程的用户正在做无用工作时发送给进程)sigint(中断)sigbus(总线错误)等。
(2)管道是一个环形缓冲区,允许两个进程以生产者/消费者的模型进行通信。先进先出队列,由一个进程写,另一个进程读。创建一个管道后,它的大小是固定的字节数。当一个进程试图往管道中写时,如果有足够的空间,则写请求被立即执行;否则该进程被阻塞。类似的,如果一个进程试图读取多于当前管道中的字节数时,它也被阻塞,否则读请求被立即执行。操作系统强制实施互斥,即一次只能有一个进程可以访问管道。管道分有名管道和无名管道。只有“血缘“关系的进程才可以共享无名管道,而不相关的进程只能共享有名管道。
(3) 消息是有类型的一段文本。UNIX为参与消息传递的进程提供msgsnd和msgrcv系统调用。每个进程都有一个与之相关联的消息队列,其功能类似于信箱。消息发送者指定发送的每个消息的类型,类型可以被接收者用做选择的依据。当进程试图给一个满队列发送消息时,它将被阻塞;当进程试图从一个空队列读取时也被阻塞;如果一个进程试图读取某一特定类型的消息,但由于现在还么有这种类型的消息而失败时,该进程不会阻塞。
(4)共享存储区:UNIX提供的进程间通信速度最快的形式是共享存储区。这是被多个进程所共享的虚存中的一个公共内存块。进程读写共享存储区所使用的机器指令与读写虚存的其他空间所使用的指令相同。每个进程有一个只读或读写的权限。互斥约束不属于共享存储区机制的一部分,但必须由使用共享存储区的进程提供。
(5)信号量semWait和semSignal原语的基础上进行推广。一个信号量包含以下元素:信号量的当前值\在信号量上操作的最后一个进程的进程ID\等待该信号量的值大于当前值的进程数\等待该信号量的值为0的进程数。与信号量相关联的是在该信号量上阻塞的进程队列。信号量实际上是以集合的形式创建的,一个信号量集合有一个或多个信号量 。
4编程题:给定扑克牌中的序列(123456789TJQKA),1代表1,T代表10(十进制)A代表14(十进制),求相应十进制表示的字符串序列。我理解的就是14进制转换为10进制,其中数都是用字符串表示,且14进制给定的数序列中没有0.
5.编程题: 图G用邻接矩阵表示,求图G的联通子图
广度或者深度遍历图,当遇到栈空或者队列为空时,一个联通子图找到,再找图中没有遍历过的点,继续。
6.算法题:给定一个单词,在字典中求其兄弟单词,数据结构和算法。若单词改成汉语短语(长度小于5)该如何求解,需要哪些改变?
4.排序的稳定性
希尔排序,直接选择排序,堆排序,快排是不稳定的;
二分插入排序,插入排序,冒泡排序,基数排序,归并排序是稳定的。
2.touch一个不存在的文件占不占内存
3.& * *& 复杂的一道。