【213天】黑马程序员27天视频学习笔记【Day23-下】

叨逼叨两句

  1. 插。。没办成。又得等。
  2. 累死了。

23-04:按层级打印

  1. 注意那个lev的小细节
package com.test.demo001;

import java.io.File;
import java.util.Scanner;

/**
 * @author wangtao
 * 1. 获取所有文件和文件夹,返回File数组。
 * 2. 遍历该数组。
 * 3. 无论是文件还是文件夹都直接打印。
 * 4. 如果是文件夹,递归调用。
 */
public class Demo013 {
    public static void main(String[] args) {
        File dir = getDir();
        printLev(dir,0);
    }
    
    public  static void printLev(File dir,int lev) {
        File[] subFiles = dir.listFiles();
        for (File subFile : subFiles) {
            for(int i = 0;i <= lev;i++){
                System.out.print("\t");
            }
            System.out.println(subFile);
            if(subFile.isDirectory()){
                printLev(subFile,lev + 1); //此处不能使用lev++和++lev,他们都会改变lev的值
            }
        }
    }
    

    public static File getDir(){
        //1. 创建键盘录入对象
        Scanner sc = new Scanner(System.in);
        //2. 定义一个无限循环
        while(true){
            System.out.println("请输入文件夹路径:");
            String line = sc.nextLine();
            
            //3. 将键盘录入的结果存储在字符串中,并封装成File对象
            File file = new File(line);
            
            //4. 对File对象做判断
            if(!file.exists()){
                System.out.println("该文件夹不存在,请重新输入");
            }else if(file.isFile()){
                System.out.println("您输入的是文件路径,请输入文件夹路径");
            }else{
                //5. 将文件夹路径对象返回
                return file;
            }
        }
    }
}

23-05:斐波那契数列的两种算法

  1. 数组

    package com.test.demo001;
    
    public class Demo014 {
        public static void main(String[] args) {
            //数组形式
            int[] arr = new int[8];
            arr[0] = 1;
            arr[1] = 1;
            for(int i = 2;i < arr.length;i++){
                arr[i] = arr[i - 2] + arr[i - 1];
            }
            System.out.println(arr[arr.length-1]);
        }
    }
  2. 递归

    package com.test.demo001;
    
    public class Demo014 {
        public static void main(String[] args) {
            System.out.println(get(8));
        }
        
        public static int get(int num){
            if(num == 1 || num == 2){
                return 1;
            }else{
                return get(num - 2) + get(num -1);
            }
        }
    }

23-06:1000的阶乘所有零和尾部零的个数

  1. 以下方式求阶乘超表数范围

    package com.test.demo001;
    
    public class Demo014 {
        public static void main(String[] args) {
            int result = 1;
            for(int i = 1;i <= 1000;i++){
                result = result * i; 
            }
            System.out.println(result);//超出int类型的表数范围了
        }
    }
  2. 求1000阶乘结果中有多少个零

    package com.test.demo001;
    
    import java.math.BigInteger;
    
    public class Demo014 {
        public static void main(String[] args) {
            BigInteger bi1 = new BigInteger("1");
            for(int i = 1;i <= 1000;i++){
                BigInteger bi2 = new BigInteger(i + "");
                bi1 = bi1.multiply(bi2);
            }
            System.out.println(bi1);
            int count = 0;
            String str = bi1.toString();
            for(int i = 0;i < str.length();i++){            
                if('0' == str.charAt(i)){
                    count++;
                }    
            }
            System.out.println(count);
        }
    }
  3. 求1000阶乘结果尾部有多少个零

    package com.test.demo001;
    
    import java.math.BigInteger;
    
    public class Demo014 {
        public static void main(String[] args) {
            BigInteger bi1 = new BigInteger("1");
            for(int i = 1;i <= 1000;i++){
                BigInteger bi2 = new BigInteger(i + "");
                bi1 = bi1.multiply(bi2);
            }
            System.out.println(bi1);
            int count = 0;
            String str = bi1.toString();
            for(int i = str.length()-1; i >= 0; i--){
                if('0'==str.charAt(i)){
                    count++;
                } else {
                    break;
                }
            }
            System.out.println(count);
            
            
        }
    }

23-07:使用递归求1000阶乘尾部零的个数

  1. 逢5的倍数至少得一个零
  2. 逢5*5的倍数至少得两个零
  3. 5*5*5的倍数至少是三个零
  4. 5*5*5*5的倍数至少是四个零
  5. 具体见视频【23-07】

【213天】黑马程序员27天视频学习笔记【Day23-下】

23-08:约瑟夫环

  1. i--那要注意
  2. count用来做为计数其
  3. i用来作为索引(指针)
package com.test.demo001;

import java.util.ArrayList;

public class Demo014 {
    public static void main(String[] args) {
        
    }
    public static int getLucklyNum(int num){
        ArrayList<Integer> list = new ArrayList<>();
        for(int i = 1;i <= num;i++){
            list.add(i);
        }
        int count = 1;
        for(int i = 0; list.size()!= 1; i++) {
            if(i == list.size()){
                i = 0;
            }
            
            if(count % 3 ==0){
                list.remove(i--);  //这个i--要注意!
            }
            
            count++;
        }
        return list.get(0);
    }
}

相关推荐