2017秋招编程题小记


前言:此处只记录我遇到的部分编程题,而另一篇文章只记录知识点。

部分知识点记录
http://blog.csdn.net/bestzem/article/details/52434236


百度(研发岗)


给定初始值initVal,行rows,列cols,得到增量矩阵A,求出A*A’,并返回。函数如下:

int **fun(int initVal, int rows, int cols)
{
    //write code here
}

eg:3 4 2
3 4
5 6
7 8
9 10
*
3 5 7 9
4 6 9 10
返回
25 39 53 67
39 61 83 105
53 83 113 143
67 105 143 181


主要问题:
1、直接将结果矩阵计算出来,不要间接计算。
2、返回指针的指针(二维矩阵,动态内存)。注意申请方法,和初始化(想不到我竟然卡在了这里)。

    pint *r=new pint[rows];
    for (int i = 0;i < rows;++i)
    {
        r[i] = new int[rows];
    }
    for (int j = 0;j < rows;++j)
    {
        for (int i = 0;i < rows;++i)
        {
            r[j][i]=0;
        }
    }

#include <iostream>
using namespace std;
typedef int *pint;//申请动态二维空间
int **fun(int initVal, int rows, int cols)
{
    //write code here
    pint *r=new pint[rows];
    for (int i = 0;i < rows;++i)
    {
        r[i] = new int[rows];
    }
    for (int j = 0;j < rows;++j)
    {
        for (int i = 0;i < rows;++i)
        {
            r[j][i]=0;
        }
    }
    for (int j = 0;j < rows;++j)
    {
        int valOfRow = initVal + j*cols;
        for (int i = 0;i < rows;++i)
        {
            int valOfCol = initVal + i*cols;
            for (int k = 0;k < cols;++k)
            {
                r[j][i] += (valOfRow + k)*(valOfCol + k);
            }
        }
    }
    return r;
}

int main()
{
    int n = 0, r = 0, c = 0;
    while (cin >> n >> r >> c)
    {
        int **res = fun(n, r, c);
        for (int j = 0;j < r;++j)
        {
            for (int i = 0;i < r;++i)
            {
                cout << res[j][i];
                if (i != r - 1) cout << " ";
            }
            if (j != r - 1) cout << endl;
        }
        //delete....
    }
}

这里写图片描述


网易(杭州运维研发岗)


小易是一个数论爱好者,并且对于一个数的奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数f(x)为x最大的奇数约数,x为正整数。 例如:f(44) = 11.
现在给出一个N,需要求出 f(1) + f(2) + f(3)…….f(N)
例如: N = 7
f(1) + f(2) + f(3) + f(4) + f(5) + f(6) + f(7) = 1 + 1 + 3 + 1 + 5 + 3 + 7 = 21
小易计算这个问题遇到了困难,需要你来设计一个算法帮助他。


分析:
1、N=7
g(7)=f(1)+f(2)+f(3)+f(4)+f(5)+f(6)+f(7)
奇数部分直接为该奇数,先求奇数和
g(7)=1+3+5+7+f(2)+f(4)+f(6)
=(1+7)*((1+7)/2)/2+f(2)+f(4)+f(6)
=16+f(2)+f(4)+f(6)
现在剩下的偶数,每个/2可以得到对的最大约数1、2、3,也就是
g(3)=f(2)+f(4)+f(6)=f(1)+f(2)+f(3)
故:g(7)=奇数和+g(3);
2、N=8
g(7)=f(1)+f(2)+f(3)+f(4)+f(5)+f(6)+f(8)
奇数部分直接为该奇数,先求奇数和
g(7)=1+3+5+7+f(2)+f(4)+f(6)+f(8)
=(1+7)*((1+7)/2)/2+f(2)+f(4)+f(6)+f(8)
=16+f(2)+f(4)+f(6)+f(8)
现在剩下的偶数,每个/2可以得到对的最大约数1、2、3、4,也就是
g(4)=f(2)+f(4)+f(6)+f(8)=f(1)+f(2)+f(3)+f(4)
故:g(7)=奇数和+g(4);
综上:
g(N)=奇数和+g(N/2),而奇数和可以定为:
N为奇数时,(1+N)*((1+N)/2)/2。其中(1+N)/2为个数。
变形为((1+N)/2)*((1+N)/2)如此一来,便也适用于偶数时候。
故:g(N)=((1+N)/2)*((1+N)/2)+g(N/2)

牛客的解题题
http://www.nowcoder.com/discuss/9620


#include <iostream>
using namespace std;
typedef unsigned long long ull;
ull getResult(int n) {
    if(n==0)    return 0;
    return (ull)((n+1)/2)*((n+1)/2)+getResult(n/2);
}

int main() {
    int n;
    while (cin >> n) {
        cout << getResult(n) << endl;
    }
}

完美世界 (技术综合A卷)


这里写图片描述
这里写图片描述


考完了写的,这次真的是0成功率啊。不知道我现在写对没有,反正给的测试用例通过了。其实思路很简单,就是代码量有点大,还有输入的不确定性太大。我暂时没有比较好的方法处理。另外,我在处理移动的时候暴利移动的,其实可以有点技巧的。此处省略。


#include <iostream>
#include <string>
#include <vector>
using namespace std;
const int RED = 0, GREEN = 1, BLUE = 2, YELLOW = 3, PURPLE = 4;
int p[10][10] = {
    { RED,RED,BLUE,BLUE,GREEN,YELLOW,BLUE,YELLOW,RED,PURPLE },
    { GREEN,GREEN,GREEN,BLUE,RED,PURPLE,RED,YELLOW,YELLOW,BLUE },
    { BLUE,RED,RED,YELLOW,YELLOW,PURPLE,BLUE,GREEN,GREEN,BLUE },
    { YELLOW,RED,BLUE,YELLOW,BLUE,RED,PURPLE,GREEN,GREEN,RED },
    { YELLOW,RED,BLUE,BLUE,PURPLE,GREEN,PURPLE,RED,YELLOW,BLUE },
    { PURPLE,YELLOW,RED,RED,YELLOW,RED,PURPLE,YELLOW,RED,RED },
    { YELLOW,YELLOW,GREEN,PURPLE,GREEN,RED,BLUE,YELLOW,BLUE,GREEN },
    { RED,YELLOW,BLUE,BLUE,YELLOW,GREEN,PURPLE,RED,BLUE,GREEN },
    { GREEN,GREEN,YELLOW,YELLOW,RED,RED,PURPLE,BLUE,BLUE,GREEN },
    { PURPLE,BLUE,RED,RED,PURPLE,YELLOW,BLUE,RED,RED,GREEN } };

void merge(vector<int> &change)
{
    for (int i = 0;i < 10;++i)
    {
        int count = 0;
        for (int j = 0;j < 10;++j)
        {
            if (change[j * 10 + i] == -1)
            {
                ++count;
            }
        }
        if (count == 10)
        {
            for (int x = i;x < 9;++x)
            {
                for (int y = 0;y < 10;++y)
                {
                    change[y * 10 + x] = change[y * 10 + x+1];
                }
            }
            for (int y = 0;y < 10;++y)
            {
                change[y * 10 + 9] = -1;
            }
        }
        else
        {
            for (int y = 9;y >= 0;--y)
            {
                if (change[y * 10 + i] == -1)
                {
                    for (int k = y;k >0;--k)
                    {
                        change[k * 10 + i] = change[(k - 1) * 10 + i];
                    }
                    change[i] = -1;
                }
            }
        }
    }
}

void help(vector<int> &change, const int &val,int op)
{
    if (val == -1)  return;
    int x = op % 10, y = op / 10;
    change[op] = -1;
    if (x > 0&&change[op-1]==val)//left
    {
        help(change, val, op-1);
    }
    if (x < 9 && change[op +1] == val)//right
    {
        help(change, val, op+1);
    }
    if (y > 0 && change[op - 10] == val)//up
    {
        help(change, val, op-10);
    }
    if (y < 9 && change[op + 10] == val)
    {
        help(change, val, op + 10);
    }
    merge(change);
}

void getResult(string &str)
{
    vector<int> v(100);
    for (int j = 0;j < 10;++j)
    {
        for (int i = 0;i < 10;++i)
        {
            v[j*10+i]= p[j][i];
        }
    }
    int op = 0;
    int len = str.length();
    for (int t=0;t<=len;++t)
    {
        if (str[t] != ' '&&str[t]!='\0')
        {
            op = 10 * op + str[t] - '0';
        }
        else
        {
            if (v[op] != -1)
            {
                int val = v[op];
                int x = op % 10, y = op / 10;

                if (x > 0 && v[op - 1] == val)//left
                {
                    v[op] = -1;
                    help(v, val, op - 1);
                }
                if (x < 9 &&v[op + 1] == val)//right
                {
                    v[op] = -1;
                    help(v, val, op + 1);
                }
                if (y > 0 && v[op - 10] == val)//up
                {
                    v[op] = -1;
                    help(v, val, op - 10);
                }
                if (y < 9 && v[op + 10] == val)
                {
                    v[op] = -1;
                    help(v, val, op + 10);
                }
            }

            op = 0;
        }
    }
    int a = 0, b = 0, c = 0, d = 0, e = 0;
    for (int i = 0;i < 10;++i)
    {
        for (int j = 0;j < 10;++j)
        {
            if (v[i * 10 + j] == 0)
                ++a;
            else if (v[i * 10 + j] == 1)
                ++b;
            else if (v[i * 10 + j] == 2)
                ++c;
            else if (v[i * 10 + j] == 3)
                ++d;
            else if (v[i * 10 + j] == 4)
                ++e;
        }
    }
    std::cout << a << " " << b << " " << c << " " << d << " " << e << endl;
}
int main()
{
    string str{""};
    while (getline(cin,str))
    {
        getResult(str);
    }
    return 0;
}

这里写图片描述


WPS


arr[] = { 1,2,3,4,5,6,7,8,9}, posArray[] = { 5,3,4,2,1,0,6,7,8 }
将arr数组按照posArray给的索引排序,排序结果:6 4 5 3 2 1 7 8 9。


#include <iostream>
using namespace std;
void help(int *array, int *posArray, const int &N, int pos, int i)
{
    int pos1 = posArray[pos];
    if (pos1 > i)
    {
        swap(array[pos1], array[i]);
    }
    else if (pos1<i)
    {
        help(array, posArray, N, pos1, i);
    }
}
void sortByPosArray(int *array, int *posArray,const int &N)
{
    for (int i = 0;i <N;++i)
    {
        int pos = posArray[i];
        if (pos > i)
        {
            swap(array[pos], array[i]);
        }
        else if(pos<i)
        {
            help(array, posArray, N, pos, i);
        }
        //输出步骤
        for (int i = 0;i<N;++i)
        {
            cout << array[i] << "\t";
        }
        cout << endl;
    }

}
int main()
{
    const int N = 9;
    int arr[] = { 1,2,3,4,5,6,7,8,9}, posArray[] = { 5,3,4,2,1,0,6,7,8 };
    sortByPosArray(arr, posArray,N);
    for (int i=0;i<N;++i)
    {
        cout << arr[i] << "\t";
    }
    cout << endl;
    system("pause");
    return 0;
}

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值