注:本系列题目全是按照通过率降序来排列的,基本保证题目难度递增。
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;
}