题目一:
斐波那契数,通常用
F(n)
表示,形成的序列称为 斐波那契数列 。该数列由0
和1
开始,后面的每一项数字都是前面两项数字的和。也就是:F(0) = 0,F(1) = 1 F(n) = F(n - 1) + F(n - 2),其中 n > 1给你
n
,请计算F(n)
。
题目不难,用移动框的方法足以解决
解题代码:
int fib(int n) {
if (n < 2) {
return n;
}
int p = 0, q = 0, r = 1;
for (int i = 2; i <= n; ++i) {
p = q;
q = r;
r = p + q;
}
return r;
}
题目二:
泰波那契序列 Tn 定义如下:
T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2
给你整数
n
,请返回第 n 个泰波那契数 Tn 的值。
和斐波那契的方法一样
解题代码:
int tribonacci(int n){
if(n<2)
return n;
if(n==2)
return 1;
int a,b=0;int c=1;int t=1;
for(int i=3;i<=n;i++)
{
a=b;
b=c;
c=t;
t=a+b+c;
}
return t;
}
题目三:
如果数组是单调递增或单调递减的,那么它是单调的。
如果对于所有
i <= j
,A[i] <= A[j]
,那么数组A
是单调递增的。 如果对于所有i <= j
,A[i]> = A[j]
,那么数组A
是单调递减的。当给定的数组
A
是单调数组时返回true
,否则返回false
。
此题也很简单,加个计数器对递增递减进行判断即可
解题代码:
bool isMonotonic(int* nums, int numsSize){
int i=0;
int count=0;
int ret=0;
for(i=0;i<numsSize;i++)
{
if(i+1<numsSize)
{
if(nums[i]<=nums[i+1])
count++;
if(nums[i]>=nums[i+1])
ret++;
}
}
if(count==numsSize-1||ret==numsSize-1)
return true;
return false;
}
题目四:
给定一个正整数
N
,试求有多少组连续正整数满足所有数字之和为N
?输入: 5 输出: 2 解释: 5 = 5 = 2 + 3,共有两组连续整数([5],[2,3])求和后为 5。
题目本身做起来并不难,暴力求解,一个个加然后判断即可。
解题代码1:
int consecutiveNumbersSum(int n){
int i=0;
int j=0;
int count=0;
for(i=1;i<=n/2;i++)
{
int sum=0;
int i_=i;
while(1)
{
sum+=i_++;
if(sum>=n)
break;
}
if(sum==n)
count++;
}
return count+1;
}
此代码能的出正确结果,但提交时会超时,所以我们要选择另一种方法:找规律
首先,最小的两个连续正整数相加1+2=3,大点的就是2+3=5=1+2+2,再大点3+4=7=2+3+2=1+2+(2+2),从中可以看出如果存在两个连续正整数之和等于N,那么必然N=1+2+2k(k为正整数),N-(1+2)可以整除2,即(N-(1+2))%2 == 0.
往下推,n个连续正整数就是,(N-(1+2+...+n))%n == 0
解题代码2:
int consecutiveNumbersSum(int N)
{
int i = 1, s = 0, result = 1;
while(1)
{
s += i++;
if(N <= s)
{
break;
}
if( (N-s)%i==0)
{
result++;
}
}
return result;
}