网易有道笔试题
2014-02-25 15:11
295 查看
这几道题都是从网上找的不知道是哪一年的网易有道的笔试题,拿来做做,练练手。
1、打印如下形式的矩阵;
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>
using namespace std;
void PrintMatrix(int** arr, int n)
{
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < n; ++j)
{
cout<<arr[i][j]<<'\t';
}
cout<<endl;
}
}
void SetValue(int** arr, int n)
{
arr[0][0] = 1;
int currentRow = 1, currentCol = 1;
int currentValue = 1;
while(currentRow < n)
{
//up -> down -> left
if(currentRow < n)
{
for(int i = 0; i <= currentRow; ++i)
arr[i][currentCol] = ++currentValue;
for(int i = currentCol-1; i >= 0; --i)
arr[currentRow][i] = ++currentValue;
}
++currentRow;
++currentCol;
//left -> right -> up
if(currentRow < n)
{
for(int i = 0; i <= currentCol; ++i)
arr[currentRow][i] = ++currentValue;
for(int i = currentRow - 1; i >= 0; --i)
arr[i][currentCol] = ++currentValue;
}
++currentRow;
++currentCol;
}
}
int main()
{
int n = 0;
while(cin>>n)
{
if(n <= 0)
return 1;
int** arr = new int*
;
for(int i = 0; i< n; ++i)
arr[i] = new int
;
SetValue(arr,n);
PrintMatrix(arr,n);
for(int i = 0; i < n; ++i)
delete []arr[i];
delete []arr;
}
return 0;
}
2.写一个函数,打印一个如下的n x n的矩阵
例如:
n = 5
1 1 1 1 1
1 2 3 2 1
1 3 6 3 1
1 2 3 2 1
1 1 1 1 1
n = 6
1 1 1 1 1 1
1 2 3 3 2 1
1 3 6 6 3 1
1 3 6 6 3 1
1 2 3 3 2 1
1 1 1 1 1 1
分析:这道题和上一题差不多了,n=6时是对称的,把左上角求出来就行了 ,左上角边上的都是1,里边的元素又是上边和左边的元素之和。
3、表达式求值,一个字符串只由'+','-',和‘0’-‘9’组成,并且'+','-'只作为二元运算符。
bool calculate(const char* exp, int &result);
bool calculate( const char* str, int &result )
{
string expstr(str);
int res = 0;
int i, j = 0;
while(expstr[j] != '+' && expstr[j] != '-')
++j;
result = atoi(expstr.substr(0,j).c_str());
bool isAdd = true;
if(expstr[j] == '+')
isAdd = true;
else
isAdd = false;
i = ++j;
for(; j < expstr.length(); ++j)
if(expstr[j] != '+' && expstr[j] != '-')
continue;
else
{
int tmp = atoi(expstr.substr(i,j-i).c_str());
if(isAdd)
result += tmp;
else
result -= tmp;
if(expstr[j] == '+')
isAdd = true;
else
isAdd = false;
i = j+1;
}
int tmp = atoi(expstr.substr(i,j-i).c_str());
if(isAdd)
result += tmp;
else
result -= tmp;
return true;
}
1、打印如下形式的矩阵;
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>
using namespace std;
void PrintMatrix(int** arr, int n)
{
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < n; ++j)
{
cout<<arr[i][j]<<'\t';
}
cout<<endl;
}
}
void SetValue(int** arr, int n)
{
arr[0][0] = 1;
int currentRow = 1, currentCol = 1;
int currentValue = 1;
while(currentRow < n)
{
//up -> down -> left
if(currentRow < n)
{
for(int i = 0; i <= currentRow; ++i)
arr[i][currentCol] = ++currentValue;
for(int i = currentCol-1; i >= 0; --i)
arr[currentRow][i] = ++currentValue;
}
++currentRow;
++currentCol;
//left -> right -> up
if(currentRow < n)
{
for(int i = 0; i <= currentCol; ++i)
arr[currentRow][i] = ++currentValue;
for(int i = currentRow - 1; i >= 0; --i)
arr[i][currentCol] = ++currentValue;
}
++currentRow;
++currentCol;
}
}
int main()
{
int n = 0;
while(cin>>n)
{
if(n <= 0)
return 1;
int** arr = new int*
;
for(int i = 0; i< n; ++i)
arr[i] = new int
;
SetValue(arr,n);
PrintMatrix(arr,n);
for(int i = 0; i < n; ++i)
delete []arr[i];
delete []arr;
}
return 0;
}
2.写一个函数,打印一个如下的n x n的矩阵
例如:
n = 5
1 1 1 1 1
1 2 3 2 1
1 3 6 3 1
1 2 3 2 1
1 1 1 1 1
n = 6
1 1 1 1 1 1
1 2 3 3 2 1
1 3 6 6 3 1
1 3 6 6 3 1
1 2 3 3 2 1
1 1 1 1 1 1
分析:这道题和上一题差不多了,n=6时是对称的,把左上角求出来就行了 ,左上角边上的都是1,里边的元素又是上边和左边的元素之和。
#include<iostream> using namespace std; void PrintMatrix(int** arr, int n) { for(int i = 0; i < n; ++i) { for(int j = 0; j < n; ++j) { cout<<arr[i][j]<<'\t'; } cout<<endl; } } void SetValue(int** arr, int n) { int bundary = (n-1)/2; for(int i = 0; i <= bundary; ++i) { arr[0][i] = 1; arr[i][0] = 1; } for(int i = 1; i <= bundary; ++i) for(int j = 1; j <= bundary; ++j) arr[i][j] = arr[i-1][j] + arr[i][j-1]; for(int i = 0; i <= bundary; ++i) for(int j = bundary+1; j < n; ++j) arr[i][j] = arr[i][n-1-j]; for(int i = bundary+1; i < n; ++i) for(int j = 0; j < n; ++j) arr[i][j] = arr[n-1-i][j]; } int main() { int n = 0; while(cin>>n) { if(n <= 0) return 1; int** arr = new int* ; for(int i = 0; i< n; ++i) arr[i] = new int ; SetValue(arr,n); PrintMatrix(arr,n); for(int i = 0; i < n; ++i) delete []arr[i]; delete []arr; } return 0; }
3、表达式求值,一个字符串只由'+','-',和‘0’-‘9’组成,并且'+','-'只作为二元运算符。
bool calculate(const char* exp, int &result);
bool calculate( const char* str, int &result )
{
string expstr(str);
int res = 0;
int i, j = 0;
while(expstr[j] != '+' && expstr[j] != '-')
++j;
result = atoi(expstr.substr(0,j).c_str());
bool isAdd = true;
if(expstr[j] == '+')
isAdd = true;
else
isAdd = false;
i = ++j;
for(; j < expstr.length(); ++j)
if(expstr[j] != '+' && expstr[j] != '-')
continue;
else
{
int tmp = atoi(expstr.substr(i,j-i).c_str());
if(isAdd)
result += tmp;
else
result -= tmp;
if(expstr[j] == '+')
isAdd = true;
else
isAdd = false;
i = j+1;
}
int tmp = atoi(expstr.substr(i,j-i).c_str());
if(isAdd)
result += tmp;
else
result -= tmp;
return true;
}
相关文章推荐
- 国内科研主力军
- Android入门第十五篇之ActivityGroup + GridView 实现Tab分页标签
- Oracle数据库如何创建DATABASE LINK?(转载)
- 7.8.1: 深入理解容器中的Bean---使用抽象Bean
- 字符串转化成整数
- “段寄存器”的故事
- Discuz常用函数解析
- 企业管理器开启和关闭数据库时出现Error Messsage
- ios教程汇总
- 编程之美4.3 买票找零解法二
- 7.7.3: Bean实例的创建方式及依赖配置---调用实例工厂方法创建Bean
- 自动生成表的字段名
- rhcs 怪现象 未找到原因
- OLE DB provider "SQLNCLI11" for linked server "10.0.9.137" returned message "事务中的登记已经存在。". 消息 7395,级
- ZOJ1001
- webx学习总结
- 彩信包存入数据库(发件箱)
- 7.7.2: Bean实例的创建方式及依赖配置---使用静态工厂方法创建Bean
- powerdesigner Could not Initialize JavaVM
- IOS开发 UIWebView使用详解(2)