注:本系列题目全是按照通过率降序来排列的,基本保证题目难度递增。
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=0y=1while 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://没有就放进去continueelse: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=0for j in l://查找if i==j:a+=1if 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:breakelif a[j]==a[j+1]:print("Dislikes")q=1//后面就不会执行了
for z in range(len(a)-3)://遍历判断条件if q==1:breakfor 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=1breakif v==1:break
if q==0://执行到这里就是likeprint("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);elseprintf("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;
}