17校招真题题集(2)6-10

注:本系列题目全是按照通过率降序来排列的,基本保证题目难度递增。

6、

题目名称:Fibonacci数列

来源:网易

题目描述

Fibonacci数列是这样定义的:
F[0] = 0
F[1] = 1
for each i ≥ 2: F[i] = F[i-1] + F[i-2]
因此,Fibonacci数列就形如:0, 1, 1, 2, 3, 5, 8, 13, ...,在Fibonacci数列中的数我们称为Fibonacci数。给你一个N,你想让其变为一个Fibonacci数,每一步你可以把当前数字X变为X-1或者X+1,现在给你一个数N求最少需要多少步可以变为Fibonacci数。

输入描述:

输入为一个正整数N(1 ≤ N ≤ 1,000,000)

输出描述:

输出一个最小的步数变为Fibonacci数"

示例1

输入

15

输出

2

分析:我们不断生成斐波那契数列,生成到比输入大了以后,比较这一个数和前一个数就好。

def ojbk(n):
    x=0
    y=1
    while 1:
        if y>n: return min(y-n, n-x)
        x,y=y,x+y
print(ojbk(input()))

7、

题目名称:数字反转

来源:网易

题目描述

对于一个整数X,定义操作rev(X)为将X按数位翻转过来,并且去除掉前导0。例如:
如果 X = 123,则rev(X) = 321;
如果 X = 100,则rev(X) = 1.
现在给出整数x和y,要求rev(rev(x) + rev(y))为多少?

输入描述:

输入为一行,x、y(1 ≤ x、y ≤ 1000),以空格隔开。

输出描述:

输出rev(rev(x) + rev(y))的值

示例1

输入

123 100

输出

223

分析:直接按题意写出来函数,模拟即可。

python字符串法:

L=(input("").split(' '))
a=L[0]
b=L[1]
def rev(x):
    q=int(x[::-1])
    return q
c=str(rev(a)+rev(b))
print(str(rev(c)))

简化:

a = input().split()
print(str(int(a[0][::-1]) + int(a[1][::-1]))[::-1].lstrip("0"))

c++实现高效逆置:

#include<iostream>
using namespace std;
int rev(int m)
{
    int t=0;
    while(m>0)
    {
        t=t*10+m%10;
        m=m/10;
    }
    return t;
}

int main()
{
int x,y;
    while(cin>>x>>y)
    {
        cout<<rev(rev(x) + rev(y))<<endl;
    }
    return 0;
}

8、

题目名称:下厨房

来源:网易

题目描述

牛牛想尝试一些新的料理,每个料理需要一些不同的材料,问完成所有的料理需要准备多少种不同的材料。

输入描述:

每个输入包含 1 个测试用例。每个测试用例的第 i 行,表示完成第 i 件料理需要哪些材料,各个材料用空格隔开,输入只包含大写英文字母和空格,输入文件不超过 50 行,每一行不超过 50 个字符。

输出描述:

输出一行一个数字表示完成所有料理需要多少种不同的材料。

示例1

输入

BUTTER FLOUR
HONEY FLOUR EGG

输出

4

分析:就是没有出现过的就放到一个容器里,高效查找。

python:

ll=[]//存东西
while 1:
    try:
        l=(input().split())
        for i in range(len(l)):
            if l[i] in ll://没有就放进去
                continue
            else:
                ll.append(l[i])
    except:
        print(len(ll))
        break

c++ set:

#include <iostream>
#include <set>
#include <string>
using namespace std;
int main() {
    string str;
    set<string> datas;
    while (cin >> str) {
        datas.insert(str);
    }
    cout << datas.size() << endl;
    return 0;
}

9、

题目名称:n个数里出现次数大于等于n/2的数

来源:好未来

题目描述

输入n个整数,输出出现次数大于等于数组长度一半的数。

输入描述:

每个测试输入包含 n个空格分割的n个整数,n不超过100,其中有一个整数出现次数大于等于n/2。

输出描述:

输出出现次数大于等于n/2的数。

示例1

输入

3 9 3 2 5 6 7 3 2 3 3 3

输出

3

分析:你就算暴力也是可以的

l=(input().split())
for i in l://遍历每一个数
    a=0
    for j in l://查找
        if i==j:
            a+=1
    if a>len(l)/2-1:
        print(i)
        break

当然,动态规划思想会很高效,我这里放一个链接,第一题就是

https://blog.csdn.net/hebtu666/article/details/81390118感兴趣的看一看

10、

题目名称:小易喜欢的单词

来源:网易

题目描述

小易喜欢的单词具有以下特性:
1.单词每个字母都是大写字母
2.单词没有连续相等的字母
3.单词没有形如“xyxy”(这里的x,y指的都是字母,并且可以相同)这样的子序列,子序列可能不连续。
例如:
小易不喜欢"ABBA",因为这里有两个连续的'B'
小易不喜欢"THETXH",因为这里包含子序列"THTH"
小易不喜欢"ABACADA",因为这里包含子序列"AAAA"
小易喜欢"A","ABA"和"ABCBA"这些单词
给你一个单词,你要回答小易是否会喜欢这个单词(只要不是不喜欢,就是喜欢)。

输入描述:

输入为一个字符串,都由大写字母组成,长度小于100

输出描述:

如果小易喜欢输出"Likes",不喜欢输出"Dislikes"

示例1

输入

AAA

输出

Dislikes

分析:题意i容易理解,操作挺麻烦的,根据题意实现功能就好。

看代码注释

a=input()
q=0
v=0
for i in a://遍历判断条件
    if i.islower():
        print("Dislikes")
        q=1//后面就不会执行了
        break
for j in range(len(a)-1)://遍历判断条件
    if q==1:
        break
    elif a[j]==a[j+1]:
        print("Dislikes")
        q=1//后面就不会执行了
for z in range(len(a)-3)://遍历判断条件
    if q==1:
        break
    for x in range(1,len(a)):
        if a[z]==a[x]://找到相同的
            for g in range(z+1,x)://相同的之间
                for h in range(x+1,len(a))://之后
                    if a[h]==a[g]://相同,也就是ABAB型
                        print("Dislikes")
                        v=1
                        break
                if v==1:
                    break
if q==0://执行到这里就是like
    print("Likes")

找来的c++,不是我写的:

#include "stdio.h"
#include "string.h"
 
int FindDislike(char *s,int length);
int FindForward(char *s,int x,int y,int length);
 
 
int main(){
    char s[101];
    int like=1;
     
    scanf("%s",s);
    int len=strlen(s);   
     
    //先完成有没有连续的数
    for(int i=0;i<len-1;i++){
       if(len<2){
            like=1;
        }
        else if(s[i]==s[i+1])
        {
            like=0;
            break;
        }
 
    }
    ///
    if(like==1 && len>1)
        like=FindDislike(s,len);
     
     
    if(like==1)
        printf("Likes",s);
    else
        printf("Dislikes");
    return 0;
}
 
int FindDislike(char *s,int length){
    int like=1;
    for(int i=0;i<length;i++){
        for(int j=1;j<length;j++){
            if(s[i]==s[j]) {
               like=FindForward(s,i,j,length);
                if(like==0){ return 0;}
            }      
        }
    }
    return 1;       
}
 
int FindForward(char *s,int x,int y,int length){
    if(y==length-1)
        return 1;
    for(int i=x+1;i<y;i++){
        for(int j=y+1;j<length;j++){
            if(s[i]==s[j])
                return 0;
        }
    }
    return 1;
}

猜你喜欢

转载自blog.csdn.net/hebtu666/article/details/82882307