牛客算法集合-类型划分和难度划分

做题的传送门:牛客网 - 找工作神器|笔试题库|面试经验|实习招聘内推,求职就业一站解决_牛客网 (nowcoder.com)

 

一、入门难度:

1.1、 DD4 末尾0的个数

 分析:

 文中要求阶乘中0的个数,这个时候,对于阶乘的理解,要想尾数包含0。需要考虑什么情况下才有0,只有2*5的时候,才会有0.但是对于2来说,4、6、8也含有2,导致了这三个数与5相乘含有0,前者的数量远远大于后者的数量。所以,为了简便和方便计算,我们只考虑因子5的个数,5有多少个,说明就有多少个尾数0能诞生。

java代码如下,包含了分析:

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            int n = sc.nextInt();
            System.out.println(countNum(n));
        }
    }
    
    public static int countNum(int n){
        //count表示含有因子5的个数
        int count = 0;
        
        //输入的值从大于4开始算起
        while(n > 4){
            //准备一个临时变量,自身变量用于后面判断个数要用,需要自减
            int temp = n;
            while(temp % 5 == 0){
                count++;
                //去掉一个除掉的因子5,更新新的临时变量数
                temp = temp/5;
            }
            n--;
        }
        return count;
    }
}

1.2、JD5 小球的距离

 分析:需要草稿纸上面画出过程,大概能看出一个等比的关系式,推到如草稿纸所示:

 

 由草稿纸的推导分析,可以很简单的写出代码式子:

import java.util.*;

public class Balls {
    public int calcDistance(int A, int B, int C, int D) {
        // write code here
        int result = 3*(A+B+C+D);
        return result;
    }
}

1.3、WY8 下厨房

 分析:此题不难,实质上就是查找输入的几个不同字符串的种类,对于重复的记作一个就行。利用Set集合的特性,即元素不重复就能够实现。代码如下:

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        HashSet<String> st = new HashSet<String>();
        
        while(sc.hasNext()){
            String str = sc.next();
            st.add(str);
        }
        System.out.println(st.size());
    }
}

1.4、KS9 字符串排序

 分析:这题难在不知道后面的数字怎么取,后来想到了substring方法对数组的后六位进行截取,这样就不用考虑每一个数组中英文字母的长度了。其次,对于截取的数字字符,怎么把它转换成对于的数字元素,这一点也难倒我了,看了别人的代码后,才知道用Integer.parseInt方法来处理,很巧妙。代码如下:

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        
        while(sc.hasNext()){
            int n = sc.nextInt();
            int[] m = new int[n];
            for(int i = 0; i< n;i++){
                String st = sc.next();
                int len = st.length();
                String str = st.substring(len-6,len);
                m[i] = Integer.parseInt(str);
            }
            Arrays.sort(m);
            
            for(int j = 0; j < n;j++){
                System.out.println(m[j]);
            }
        }
    }
}

1.5、WY10 分苹果

 分析见代码内容:

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        
        while(sc.hasNext()){
            //牛的数量
            int n = sc.nextInt();
            //每个牛拥有的苹果数量组成的数组
            int[] arr = new int[n];
            //苹果总数
            int sum = 0;
            
            for(int i = 0;i<arr.length;i++){
                arr[i] = sc.nextInt();
                sum += arr[i];
            }
            //苹果总数对牛的总数量进行取余,判断受否能平均分配
            if(sum % n != 0){
                System.out.println(-1);
                return;
            }
            
            //平均每个牛平分总苹果数拥有的平均数目
            int aver = sum/n;
            //移动多少次数
            int count = 0;
            //超出平均部分的个数
            int exceed = 0;
            
            for(int i = 0; i<arr.length;i++){
               
                if(arr[i] > aver){
                    exceed = arr[i] - aver;
                    if(exceed %2 != 0){
                        System.out.println(-1);
                        return;
                    }else{
                        count += exceed/2;
                    }
                }
            }
           System.out.println(count);
        }
    }
}

 1.6、WY11 星际穿越

解方程 x²+ x <= 耐久度

            一元二次方程 ax²+ bx + c = 0, (a≠0)

            运用求根公式: 在该题中 方程为:x²+ x <= 耐久度,将1耐久度移得:x²+ x - 耐久度 <= 0 (a=1, b=1, c=-耐久度)

            判别式 △ : 当△>0时有俩个解,当△=0时有一个解,当△<0时没有解; 当如题实例 耐久度=10的时候:

            △ = b² - 4ac

              1² - 4 1 * (-10)

              41

           因 △ > 0, 因此有俩个解,根据该题要求,取最大解

           求根公式: x = [-b±(b²-4ac)^(1/2)] / (2a) ,(1/2次方相当于开二次开根号)

代码:

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        //耐久度
        long count = sc.nextLong();
        
        double delta = 1-4*1*(-count);
        
        //△ < 0 无解
        if(delta<0){
            System.out.println(0);
            return;
        }
        //耐久度不可能小于0,脱离实际情况
        if(count < 0){
            System.out.println(0);
            return;
        }
        
        double x1 = (-1+Math.sqrt(delta))/2;
        double x2 = (-1-Math.sqrt(delta))/2;
        
        if(x1 > x2){
            System.out.println((long) x1);
        }else{
            System.out.println((long) x2);
        }
    }
}

 1.7、KS12 游戏海报

 分析:本人做这个题目的时候,没有想到插入的字符串海报是可以拆开来的,陷入了固定思维,所以插入的新的字符串海报的长度加1,还需要减去自身重复的长度,代码实现如下:

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String st = sc.next();
        System.out.println((st.length()+1)*26 - st.length());
    }
}

1.8、WY12 藏宝图

 分析:不用动态规划,直接双指针跑起来就行。两个指针p1和p2初始分别指向两个字符串s和t的起始字符,如果相等,两个指针都移动,否则只移动p1。最后检查一下p2是不是移动到了t.length就行,如果到了就说明所有t中的字符都在s中按照t字符串的字符顺序出现过了。

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        
        String s1 = sc.next();
        String s2 = sc.next();
        char[] c1 = s1.toCharArray();
        char[] c2 = s2.toCharArray();
        int left1 = 0;
        int left2 = 0;
        
        while(left1 < c1.length && left2 < c2.length){
            if(c1[left1] == c2[left2]){
                left1++;
                left2++;
            }else{
                left1++;
            }
        }
        System.out.println(c2.length == left2? "Yes":"No");
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值