蓝桥题练习

循环

1、隔行变色

Excel表的格子很多,为了避免把某行的数据和相邻行混淆,可以采用隔行变色的样式。
小明设计的样式为:第1行蓝色,第2行白色,第3行蓝色,第4行白色,…
现在小明想知道,从第21行到第50行一共包含了多少个蓝色的行。

请你直接提交这个整数,千万不要填写任何多余的内容。

public static void main(String[] args) {
        /*
        * count 计数
        * 思路 第一个为蓝色 第二个为白色 从21到50行
        * 单数为蓝色 i%2!=0
        * */
        int count = 0;
    	//从21开始五十结束
        for (int i = 21; i <=50 ; i++) {
            //单数为蓝色
            if (i%2!=0){
                count++;
            }
        }
        System.out.println(count);
    }

2、煤球数目

有一堆煤球,堆成三角棱锥形。具体:
第一层放1个,
第二层3个(排列成三角形),
第三层6个(排列成三角形),
第四层10个(排列成三角形),

如果一共有100层,共有多少个煤球?

请填表示煤球总数目的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

    public static void main(String[] args) {
        int sum = 0;//每层的数量
        //代表第几层
        for (int i = 1; i <=100 ; i++) {
               sum+=i;//球的数量=前一层的数量+楼层数
        }
        System.out.println(sum);
    }

3、哪天返回

小明被不明势力劫持。后被扔到x星站再无问津。小明得知每天都有飞船飞往地球,但需要108元的船票,而他却身无分文。
他决定在x星战打工。好心的老板答应包食宿,第1天给他1元钱。
并且,以后的每一天都比前一天多2元钱,直到他有足够的钱买票。
请计算一下,小明在第几天就能凑够108元,返回地球。

    public static void main(String[] args) {
        int count = 0;//计数
        int sum = 0;//统计身上的钱
        for (int i = 1; i <=108 ; i+=2) {
            sum+=i;//每次加上这一天的钱
            count++;//统计次数
            if (sum>=108) break;//如果身上钱大于108 退出循环
        }
        System.out.println(count);
    }

4、猴子分香蕉

5只猴子是好朋友,在海边的椰子树上睡着了。这期间,有商船把一大堆香蕉忘记在沙滩上离去。
第1只猴子醒来,把香蕉均分成5堆,还剩下1个,就吃掉并把自己的一份藏起来继续睡觉。
第2只猴子醒来,重新把香蕉均分成5堆,还剩下2个,就吃掉并把自己的一份藏起来继续睡觉。
第3只猴子醒来,重新把香蕉均分成5堆,还剩下3个,就吃掉并把自己的一份藏起来继续睡觉。
第4只猴子醒来,重新把香蕉均分成5堆,还剩下4个,就吃掉并把自己的一份藏起来继续睡觉。
第5只猴子醒来,重新把香蕉均分成5堆,哈哈,正好不剩!

请计算一开始最少有多少个香蕉。

一、位运算符运用

image-20220325151743543

1.1、判断奇偶数

X & 1作运算

如果结果为 1 结果为奇数

如果结果为 0 结果为偶数

int i = 1print((i&1)==1)//ture 
print((i&1)==0)//flase

1.2、判断一个整数是不是2的整数次方

(N-1)&N==0 如果等于0就是二的整数次方

int i = 5print((i-1)&i==0)//flase 

二、递归排序

2.1、斐波那契数列

斐波那契数列指的是这样一个数列:1,1,2,3,5,8,13,21,34,55,89…

这个数列从第3项开始,每一项都等于前两项之和。

    //斐波那契数列
    static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        System.out.print("请输入要输出第几个斐波那契数字:");
        int input = sc.nextInt();
        System.out.println(fib(input));
    }

    /*
    * 思路
    * 斐波那契:1,1,2,3,5,8,13...
    *   13排在斐波那契数列的第7个
    *   input = 7
    *   从13看 13= 8(第六个数) + 5(第五个数)
    *   13=(7-1)+(7-2)这里的(7-1)指第六个斐波那契数 也就是 8
    *   依次递归循环
    *   最后剩下的第2位和第1位均为1
    *   递归结束
    * */
    public static int fib(int i) {
        if (i == 1 || i == 2) {//判断是否到第二位或者第一位
            return 1;
        }
        return fib(i - 1) + fib(i - 2);//第几位数字等于(前一项-1)的位数 + (前一项-1)的位数
    }

2.2、汉诺塔

1、有三根相邻的柱子,标号为A,B,C。

2、A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘。

3、现在把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方。

image-20220330160030456

    public static void main(String[] args) {
        hnt(3,"A","B","C");
    }
    /*
    * num 代表最大的数
    * A   代表最开始的柱子
    * B   代表第二根柱子(辅助)
    * C   代表第三根柱子(目标)
    * */
    static void hnt(int num,String A,String B,String C){
        //如果num等于最小的数字 表示此次移动结束
        if (num==1){
            System.out.println("移动:"+ num + " 从 "+ A + " 到" + B);
        }else {
            //把除了最大的盘子移动到辅助用的柱子上(num-1)
            hnt(num-1,A,C,B);
            System.out.println("移动:"+ num + " 从 "+ A + " 到" + B);
            //移动(num-1)到原来用的柱子上
            hnt(num-1,C,B,A);
        }
    }

2.3、二分查找法(递归)

image-20220329160653792

/*
* arr 传入目标数组(必须有序)
* low 起始下标
* high 最终下标
* key 要查找的值
* */
static int eFSearch(int[] arr,int low,int high,int key){
        //如果起始下标大于最终下标 返回
        if (low>high){
            return -1;
        }
        /*
        * mid 中位数下标
        * 也可以使用(high-low)/2找中位数
        * */
        int mid = low+((high-low)>>1);
        int midVal = arr[mid];

        if (midVal<key){
            //如果中位数的值小于要找的值 要找的值就在中位数右边 向右查找
            //利用中位数下标+1为起始点
            return eFSearch(arr,mid+1,high,key);
        }else if (midVal>key){
            //如果中位数的值小于要找的值 要找的值就在中位数左边 向左查找
            //利用中位数下标-1为起始点
            return eFSearch(arr,low,mid-1,key);
        }else {
            return mid;
        }
    }

2.4、练习----上台阶

小白正在上楼梯,楼梯有n阶台阶,小白一次可以上1阶,2阶或者3阶,实现一个方法,计算小白有多少种走完楼梯的方式.

    private static int funtion(int input) {
        //等于0 相当于直接站在终点台阶上
        if (input==0) return 1;
        //等于1 相当于跨1步就可以到达
        if (input==1) return 1;
        //等于2 相当于跨 俩个一次 或者 一次一步 第二次跨俩步
        if (input==2) return 2;

        //最终的input 每次跨出的总和
       return funtion(input-1)+funtion(input-2)+funtion(input-3);
    }

2.5、练习----旋转数组的最小数字

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1.

三、普通排序

3.1、希尔排序

1.先选定一个小于N的整数gap作为第一增量,然后将所有距离为gap的元素分在同一组,并对每一组的元素进行直接插入排序。然后再取一个比第一增量小的整数作为第二增量,重复上述操作…
2.当增量的大小减到1时,就相当于整个序列被分到一组,进行一次直接插入排序,排序完成。

20210509190237603

static void ShellSort(int[] arr) {
        //控制增量 增量控制分组
        for (int interval = arr.length / 2; interval > 0; interval = interval / 2) {
            //插入排序
            //根据增量分组找到组中对应的元素
            for (int i = interval; i < arr.length; i++) {
                int target = arr[i];
                int j = i - interval;
                //比较大小如果比前面的值校就交换位置
                while (j > -1 && target < arr[j]) {
                    arr[j + interval] = arr[j];
                    j -= interval;
                }

                arr[j + interval] = target;
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周粥粥ya

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值