网易2017校招C++开发工程师(北京)笔试

网易2017校招C++开发工程师笔试卷(0923)

一个数字的数位和定义为这个数字所有位置的数值的总和,例如:
1234的数位和为:1+2+3+4=10
5463的数位和为:5+4+6+3=16
现在有3个数A,B,C,需要你求出在A,B范围内(包括A,B)的一个数,让X的数位和与C的数位和差值的绝对值最小。

输入描述:
输入为一行,一行有三个数A, B, C,使用空格隔开。
(1<=A,B,C<=1000000000)
(0<=B-A<=100000)

输出描述:
输出一个数,即为所求得X,如果有多解输出最小的那个解

输入例子:
1 9 10
输出例子:
1


#include <iostream>
#include <string>
#include <algorithm>
#include <map>
using namespace std;


int getNumSum( int n )
{
    int sum = 0;

    while( n > 0 )
    {
        sum += n % 10;
        n = n / 10;
    }

    return sum;
}

int main()
{
    int ret = 0;
    int A = 0;
    int B = 0;
    int C = 0;

    while( cin >> A >> B >> C )
    {
        int low = A;
        int high = B;
        int cSum = getNumSum(C);
        int result = -1;
        int curDif = -1;

        for( int i = A; i <= B; i++ )
        {
            int cur = getNumSum(i);
            int dif = cur - cSum;
            dif = dif < 0 ? -dif : dif;


            if( -1 == result )
            {
                result = i;
                curDif = dif;
            }
            else if( dif < curDif )
            {
                result = i;
                curDif = dif;
            }

            if( 0 == curDif )
            {
                break;
            }

        }

        cout << result << endl;

    }



    return ret;
}


如果一个字符串由完成相同的两段字符串组成,我们成为平方串,如:
aa,ABAB,abcabc是平方串
aaa,ABCabc,abcab不是平方串
现在给出一个字符串求它所有连续子串中有多少种平方串。
例如:
aaabccabccCC,我们发现aa,abccabcc,cc,CC这四种平方串,其中aa,cc出现了2次,但我们只统计一次计数

输入为一个字符串,长度length,0<=lengh<=50,只包含大小写字母
输出一个整数,即为所求的种类

输入例子:
aaabccabccCC
输出例子:
4


#include <iostream>
#include <string>
#include <algorithm>
#include <map>
using namespace std;

int main()
{
    int ret = 0;

    string s;

    while( cin >> s )
    {
        int len = s.length();
        int cnt = 0;
        map<string,bool> mp;

        for( int i = 0; i < len - 1; i++ )
        {
            for( int j = 2; ( i + j ) <= len; j += 2 )
            {
                string tmp = s.substr( i, j );
                string s1 = tmp.substr( 0, j / 2 );
                string s2 = tmp.substr( j / 2, j / 2 );

                if( 0 == s1.compare(s2) )
                {
                    if( mp.find(s1) == mp.end() )
                    {
                        mp[s1] = true;
                        cnt++;
                    }

                }

            }
        }

        cout << cnt << endl;
    }
    return ret;
}


一个数的二进制权重被定义为一个十进制数表示为二进制数中'1'的个数,如:
1的二进制权重就是1
1717表示二进制为11010110101,所以二进制权重为7
现在给出一个正整数,返回最小的一个大于N并且二进制权重根N相同的数

输入为一个数N(1<=N<=1000000000)
输出一个数,即为最小的一个大于N并且二进制权重跟N相同的数

输入例子:
1717
输出例子:
1718


#include <iostream>
#include <vector>
#include <math.h>
#include <climits>
#include <algorithm>
using namespace std;


unsigned long long getLeftOnePos( unsigned long long N )
{
    int ret = 0;
    int pos = 0;
    unsigned long long m = 1;
    unsigned long long sum = 0;
    bool flag = false;
    unsigned long long M = N;

    while( 0 == ( M & 0x1 )  )
    {
        pos++;
        m = m * 2;
        M >>= 1;
    }

    int oneNums = -1;

    while( 1 == ( M & 0x1 ) )
    {
        pos++;
        sum += m;
        m = m * 2;
        M >>= 1;
        oneNums++;
    }

    unsigned long long tmp = (unsigned long long)1 << oneNums;
    tmp--;
    return m - sum + tmp;
}


int main()
{
    int ret = 0;
    int N = 0;

    while( cin >> N )
    {
        cout << getLeftOnePos(N) + N << endl;
    }

    return ret;

}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值