网易笔试

Posted moon290

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网易笔试相关的知识,希望对你有一定的参考价值。

牛牛去犇犇老师家补课,出门的时候面向北方,但是现在他迷路了。虽然他手里有一张地图,但是他需要知道自己面向哪个方向,请你帮帮他。

输入描述:
每个输入包含一个测试用例。
每个测试用例的第一行包含一个正整数,表示转方向的次数N(N<=1000)。
接下来的一行包含一个长度为N的字符串,由L和R组成,L表示向左转,R表示向右转。



输出描述:
输出牛牛最后面向的方向,N表示北,S表示南,E表示东,W表示西。

 

输入例子1:
3
LRR

 

输出例子1:
E
#include <iostream>
 
using namespace std;
char s[1005];
char dir[4]="NESW";
int main()
{
    int n;
    cin>>n;
    cin>>s;
    int now=0;
    for(int i=0;i<n;++i)
        if(s[i]==‘R‘)
            now=(now+1)%4;
        else now=(now+3)%4;
    cout<<dir[now]<<endl;
}

 

 #include<iostream>
#include<string>
using namespace std;
 
void printDirection(int num){
    switch(num%4){
    case -3: cout << ‘E‘ <<endl; break;
    case -2: cout << ‘S‘ <<endl; break;
    case -1: cout << ‘W‘ <<endl; break;
    case 0: cout << ‘N‘ <<endl; break;
    case 1: cout << ‘E‘ <<endl; break;
    case 2: cout << ‘S‘ <<endl; break;
    case 3: cout << ‘W‘ <<endl; break;
    }
}
 
int main(){
    int n;
    while(cin >> n){
        string inStr;
        int dir = 0;
        cin >> inStr;
        for(int i=0; i<inStr.length(); i++){
            if(inStr[i] == ‘L‘) dir += -1;
            else dir += 1;
        }
        printDirection(dir);
    }
    return 0;
}
 

  

牛牛以前在老师那里得到了一个正整数数对(x, y), 牛牛忘记他们具体是多少了。

但是牛牛记得老师告诉过他x和y均不大于n, 并且x除以y的余数大于等于k。

牛牛希望你能帮他计算一共有多少个可能的数对。

输入描述:
输入包括两个正整数n,k(1 <= n <= 10^5, 0 <= k <= n - 1)。



输出描述:
对于每个测试用例, 输出一个正整数表示可能的数对数量。

 

输入例子1:
5 2

 

输出例子1:
7

 

例子说明1:
满足条件的数对有(2,3),(2,4),(2,5),(3,4),(3,5),(4,5),(5,3)
朴素的做法是枚举n^2个点然后跟k作比较。这显然对n<=100000的规模来说是不允许通过的。
注意到当除数是y时,当x=1~n时,余数是1,2,3,...,y-1,0循环出现,循环节长度显然是y
那么我们可以枚举y=k~n(当y<k时所有余数均小于k,因此不需要考虑)
然后对于x=1~n,总共出现了[n/y]个循环节,然后数出每个循环节里面不小于k的余数。最后再数出不满一个循环节的不小于k的余数,就是答案了。注意当k=0的时候由于余数0出现在循环的末尾,因此要特别判断。
复杂度为O(n)
#include <iostream>
#include <algorithm>
using namespace std;
 
int main()
{
    long long n,k;
    cin>>n>>k;
    long long ans=0;
    for(int y=max(1LL,k);y<=n;++y)
    {
        int res=0;
        res=n/y*(y-k);
        if(n%y>=k)
            if(k)
                res+=n%y-k+1;
            else res+=n%y;
        ans+=res;
    }
    cout<<ans<<endl;
}

 

给你一些序列1,12,123,1234,12345,123456,1234567,12345678,123456789,12345678910,1234567891011,.....给你两个数字a,b,问第a个序列到第b个序列之间能被三整除的数的个数。

解题思路:发现规律,每三个序列为一组1,12,123,第一个数不能被3整除,第二个第三个数能被三整除,1234,12345,123456,第一个数不能被三整除,第二个和但三个数能被三整除。

#include <cstdio>  
int main()  
{  
    int t;  
    scanf("%d",&t);  
    int kcase=1;  
    while(t--)  
    {  
        int a,b;  
        scanf("%d%d",&a,&b);  
        int tmp1=b/3;//找到前面有多少组3   
        tmp1=tmp1*2;//每组有两个能被三整除   
        if(b%3==2)//看这个数本身能否被3整除,即排在该组的第二个数   
        {  
            tmp1=tmp1+1;  
        }  
        int tmp2=a/3;//同上   
        tmp2=tmp2*2;  
        if(a%3==2)  
        {  
            tmp2=tmp2+1;  
        }  
        int ans=tmp1-tmp2;  
        if(a%3==0||a%3==2)//如果是第三个数或第二个数,那么多减了a这个数,那么补上去   
        {  
            ans++;  
        }  
        printf("Case %d: %d\n",kcase++,ans);  
    }  
    return 0;  
}  

 

思路:该题涉及的数字比较大,不能直接用整形或是长整型来存储数字,可以用字符串来存储数字,判定能否被3整除的方法就是看将数字各位的数相加得到的数能否被3整除。

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

bool divide(string str) {
    int num = 0;
    for (int i = 0; i < str.length(); i++) {
        num += (str[i] - ‘0‘);
    }
    if (num % 3 == 0) {
        return true;
    }
    return false;
}

int main() {
    int l = 0, r = 0, count = 0;
    string num = "";
    cin >> l >> r;
    for (int i = 1; i <= l; i++) {
        num += to_string(i);
    }
    for (int i = l; i <= r; i++) {
        if (divide(num))
            count++;
        num += to_string(i + 1);
    }
    cout << count << endl;
    return 0;
}

 

以上是关于网易笔试的主要内容,如果未能解决你的问题,请参考以下文章

算法99---丰收(网易笔试)--二分查找

网易测试开发工程师笔试体会(秋招)

网易笔试——算法笔试真题

网易笔试(小敏)

关于网易笔试...

网易互联网笔试(3.27)