题
循环
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堆,哈哈,正好不剩!
请计算一开始最少有多少个香蕉。
一、位运算符运用
1.1、判断奇偶数
X & 1作运算
如果结果为 1 结果为奇数
如果结果为 0 结果为偶数
int i = 1;
print((i&1)==1)//ture
print((i&1)==0)//flase
1.2、判断一个整数是不是2的整数次方
(N-1)&N==0 如果等于0就是二的整数次方
int i = 5;
print((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上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方。
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、二分查找法(递归)
/*
* 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时,就相当于整个序列被分到一组,进行一次直接插入排序,排序完成。
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;
}
}
}