这里只放上允许使用C#编译的题目
试题网址:https://www.nowcoder.com/activity/oj
祝愿各位都能拿到梦寐以求的offer
难度:入门
1.斐波那契数列
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。
class Solution{
public int Fibonacci(int n)
{
int a=0,b=1,c=0;
if(n==0||n==1){
return n;
}
for(int i=1;i<n;++i){
c=a+b;
a=b;
b=c;
}
return c;
}
};
注意:全局变量中int默认初始化0,局部变量则需手动赋值。
2.最大公约数
求出两个数的最大公约数,如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数。几个自然数公有的约数,叫做这几个自然数的公约数。公约数中最大的一个公约数,称为这几个自然数的最大公约数。
//最快的方法
using System;
using System.Collections.Generic;
class Solution {
public int gcd (int a, int b) {
if(a == b)
return a;
if(a<b){//降序排列
int temp=a;
a=b;
b=temp;
}
int d=a-b,t=0;
while(d!=0){
t=d;
d=a-b;
if(b>d){
a=b;
b=d;
}
else{
a=d;
}
}
return t;
}
}
这里附上第一次写的代码,答案是对的,但超了1ms。(时间限制2000ms
虽然这个方法真的太蠢了。但后来发现暴力枚举应该直接i–。
//运行超时
using System;
using System.Collections.Generic;
class Solution {
public int gcd (int a, int b) {
int t=0;
for(int i=1;i<a&&i<b;i++){
if(a%i==0&&b%i==0){
t=i;
}
}
return t;
}
}
这里顺便附上“风林小牛”大佬的解答(在网址题目下方的讨论中就可以看到了(原用java
using System;
using System.Collections.Generic;
class Solution {
public int gcd (int a, int b) {
// 方法1:暴力枚举
int min = a < b ? a : b;
for(int i = min;i >= 1;i--){
if(a % i == 0 && b % i == 0){
return i;
}
}
return 0;
//方法2:暴力枚举法优化
// int max = a > b ? a : b;
// int min = a < b ? a : b;
// if(max % min == 0) return min;
// for(int i = min / 2;i >= 1;i--){
// if(a % i == 0 && b % i == 0){
// return i;
// }
// }
// return 0;
//方法3:辗转相除法
// int max = a > b ? a : b;
// int min = a < b ? a : b;
// if(max % min == 0) return min;
// return gcd(max % min, min);
//方法4:更相减损术(避免了取模运算,用效率更高的减法运算替代)
// int max = a > b ? a : b;
// int min = a < b ? a : b;
// if(max % min == 0) return min;
// return gcd(max - min, min);
//方法5:更相减损术非递归实现
// while(a != b){
// if(a > b) a -= b;
// else b -= a;
// }
// return a;
//方法6:3与4相结合
//3的缺点在于取模运算效率低下,4的缺点在于减法运算次数增加
//将二者结合,取其精华,去其糟粕
// if(a == b) return a;
// if((a & 1) == 0 && (b & 1) == 0){
// return gcd(a >> 1, b >> 1) << 1;
// }else if((a & 1) == 0 && (b & 1) != 0){
// return gcd(a >> 1, b);
// }else if((a & 1) != 0 && (b & 1) == 0){
// return gcd(a, b >> 1);
// }else {
// int max = a > b ? a : b;
// int min = a < b ? a : b;
// return gcd(min, max - min);
// }
}
}