牛客网在线编程----算法入门篇

标题本篇博文主要是记录下自己的在线编程情况,初次练习,有的算法还待改进,大家有需要可以去牛客网上面多练练!

有需戳–>牛客网在线编程

NC65、题目描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(0开始,第0项为0,第1项是1)
n≤39

示例1:
输入:4
返回值:3


class Solution {
public:
    int Fibonacci(int n) {
        if(n==0||n==1)
        {
            return n;
        }
        else
        {
            return Fibonacci(n-1)+Fibonacci(n-2);
        }
    }
};
NC103、题目描述
写出一个程序,接受一个字符串,然后输出该字符串反转后的字符串。(字符串长度不超过1000)
示例1:
输入"abcd"
返回值"dcba"

解题分析:我主要是通过对str倒序循环,把要倒序的字符串倒着赋值给另一个
字符串result,最后返回result。


class Solution {
public:
    string solve(string str) {
        string result="";
        for(int i=str.length()-1;i>=0;i--)
        {
            result+=str[i];
        }
        return result;
    }
};
NC107、题目描述
山峰元素是指其值大于或等于左右相邻值的元素。给定一个输入数组nums,任意两个相邻元素值不相等,数组可能包含多个
山峰。找到索引最大的那个山峰元素并返回其索引。

假设 nums[-1] = nums[n] = -∞。

示例1:
输入:[2,4,1,2,7,8,4]
返回值:5

解题分析:题目是找索引值最大的峰值元素的索引,从后往前更好,找到直接返回即可,
但要注意处理首尾元素。


class Solution {
public:
    int solve(int* a, int aLen) {
        if(a[aLen-1]>a[aLen-2])
        {
            return aLen-1;
        }
        for(int i=aLen-2;i>0;i--)
        {
            if(a[i]>a[i-1] && a[i]>a[i+1])
            {
                return i;
            }
        }
        if(a[0]>a[1])
        {
            return 0;
        }
        //给定数组没有峰值元素,返回-1
        return -1;
    }
};
NC141、题目描述
给定一个字符串,请编写一个函数判断该字符串是否回文。如果回文请返回true,否则返回false。

示例1:
输入:"absba"
返回值:true

示例2:
输入:"ranko"
返回值:false

示例3:
输入:"yamatomaya"
返回值:false

示例4:
输入:"a"
返回值:true

解题分析:判断字符串左右两边是否对称相等即可,但要注意长度奇或偶的处理。


class Solution {
public:
    bool judge(string str) {
        if(str.length()%2==1)//长度为奇数
        {
        for(int i=str.length()-1,j=0;i>str.length()/2,j<str.length()/2;j++,i--)
        {
            if(str[i]!=str[j])
            {
                return false;
            }
        }
            return true;
        }
        else //长度为偶数
        {
            for(int i=str.length()-1,j=0;i>=str.length()/2,j<str.length()/2;j++,i--)
        {
            if(str[i]!=str[j])
            {
                return false;
            }
        }
            return true;
        }
        }
};
NC151、题目描述
求出两个数的最大公约数,如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数。几个自然数公有的约数,
叫做这几个自然数的公约数。公约数中最大的一个公约数,称为这几个自然数的最大公约数。

示例1
输入:3,6
返回值:3

示例2:
输入:8,12
返回值:4
备注:a和b的范围是[1-109]


class Solution {
public:
    int gcd(int a, int b) {
        int c;
	    c=(a>b)?b:a;//c等于小者
	    while(a%c!=0||b%c!=0)//只要有一个余数不为0,便c--
	    {	
            c--;
	    }
	    return c;
    }
};
NC661、题目描述
这一天你跟你的n个朋友一起出去玩,在出门前妈妈给了你k块糖果,你决定把这些糖果的一部分分享给你的朋友们。由于你
非常热心,所以你希望你的每一个朋友分到的糖果数量都比你要多(严格意义的多,不能相等)。求你最多能吃到多少糖果?

示例1:
输入:2,10
返回值:2
说明:你可以分给你的两个朋友各4个糖果,这样你能吃到2个糖果,这样能保证你的每个朋友的糖果数都比你多,不存在你能
吃到3个或者以上糖果的情况

示例2:
输入:3,11
返回值:2
说明:你可以分给你的3个朋友各3个糖果,这样你能吃到2个糖果,这样能保证你的每个朋友的糖果数都比你多,不存在你能
吃到3个或者以上糖果的情况
 
备注:
对于百分之30的数据:1\leq n\leq 100,n\leq k\leq 1001≤n≤100,n≤k≤100
对于百分之100的数据:1\leq n\leq 1e18,n\leq k\leq 1e181≤n≤1e18,n≤k≤1e18
函数有两个long long型参数
第一个参数代表题目中的n
第二个参数代表题目中的k

解题分析:先假设拿k块糖果平均分给(n+1)个人,若余数为n,则把剩下的n块糖果分给n位朋友,不然牛牛只能分到前面均分
的糖果数目再少一块,才能保证牛牛分到的糖果比所有朋友都少。


class Solution {
public:
    long long Maximumcandies(long long n, long long k) {
        if (k % (n + 1) == n) 
            //给n+1个人平均分(k-n)块糖果,再把剩下的n块糖果给n个朋友,这样朋友就都比牛牛多了
             return k / (n + 1);
        //如果余数小于n,那么牛牛能分到的糖果得再少一块 
         return k / (n + 1) - 1;
    }
};
NC681、题目描述
牛牛有两个数a和b,他想找到一个大于a且为b的倍数的最小整数,只不过他算数没学好,不知道该怎么做,现在他想请你帮忙
给定两个数a和b,返回大于a且为b的倍数的最小整数。

示例1
输入:3,2
返回值:4
说明:大于3且为2的倍数的最小整数为4。
备注:1≤a,b≤10^9


class Solution {
public:
    int findNumber(int a, int b) {
        int num=a/b;
        return (num+1)*b;
    }
};
NC713、题目描述
牛牛想把一个数n转化为八位的二进制数,只不过牛牛不知道该怎么做,所以他想请你帮忙。
给定一个数n,返回将这个数转化为八位的二进制数(不足八位,往前补0)。

示例1:
输入:1
返回值:"00000001"
备注:0≤n≤255

解题分析:先定义并初始化一个数组b[8],从b末尾开始,循环保存每次的n%2的值,同时n=n/2,直至n<=0.
然后把数组b中的每个元素使用to_string(b[k])方法转成string类型,循环加在result中,最终返回result.


class Solution {
public:
    string tranBinary(int n) {
        int b[8]={0,0,0,0,0,0,0,0};
        for(int i=7;i>=0;i--)
        {
            if(n>0)
            {
                b[i]=n%2;
                n=n/2;
            }
        }
        string result="";
        for(int k=0;k<8;k++)
        {
            result=result+to_string(b[k]);
        }
        return result;
    }
};
NC715、题目描述
牛牛特别喜欢数字7,他想知道如果一个数字n乘以7是否是一个素数。
给定一个数字n,如果该数乘以7是一个素数,返回"YES",否则,返回"NO"。

示例1:
输入:1
返回值:"YES"
备注:1≤n≤10^8

解题分析:一个数如果只能整除本身和1,那便是素数。


class Solution {
public:
    string solve(int n) {
        for(int i=2;i<7*n;i++)
        {
            if((7*n)%i==0)
            {
                return "NO";
            }
        }
        return "YES";
    }
};

你可能感兴趣的:(C/C++,算法,c++)