算法数据结构(三十四)----根据对数器找规律&根据数据量猜解法&分治

对数器找规律

1)某个面试题,输入参数类型简单,并且只有一个实际参数

2)要求的返回值类型也简单,并且只有一个

3)用暴力方法,把输入参数对应的返回值,打印出来看看,进而优化code


题目一

小虎去买苹果,商店只提供两种类型的塑料袋,每种类型都有任意数量。

1)能装下6个苹果的袋子

2)能装下8个苹果的袋子

小虎可以自由使用两种袋子来装苹果,但是小虎有强迫症,他要求自己使用的袋子数量必须最少,且使用的每个袋子必须装满。

给定一个正整数N,返回至少使用多少袋子。如果N无法让使用的每个袋子必须装满,返回-1

 使用暴力解,查看结果可以发现规律:

1)1-17没有规律

2)18后每8个一组,奇数返回-1,偶数返回(apple-18)/8+3

public static int minBags(int apple) {
		if (apple < 0) {
			return -1;
		}
		int bag8 = (apple >> 3);
		int rest = apple - (bag8 << 3);
		while(bag8 >= 0) {
			// rest 个
			if(rest % 6 ==0) {
				return bag8 + (rest / 6);
			} else {
				bag8--;
				rest += 8;
			}
		}
		return -1;
	}


	public static int minBagAwesome(int apple) {
		if ((apple & 1) != 0) { // 如果是奇数,返回-1
			return -1;
		}
		if (apple < 18) {
			return apple == 0 ? 0 : (apple == 6 || apple == 8) ? 1
					: (apple == 12 || apple == 14 || apple == 16) ? 2 : -1;
		}
		return (apple - 18) / 8 + 3;
	}

题目二

 给定一个正整数N,表示有N份青草统一堆放在仓库里

有一只牛和一只羊,牛先吃,羊后吃,它俩轮流吃草

不管是牛还是羊,每一轮能吃的草量必须是:

141664…(4的某次方)

谁最先把草吃完,谁获胜

假设牛和羊都绝顶聪明,都想赢,都会做出理性的决定

根据唯一的参数N,返回谁会赢

解规律:每5个一组,顺序都为:后手 先手 后手 先手 先手 

// 如果n份草,最终先手赢,返回"先手"
	// 如果n份草,最终后手赢,返回"后手"
	public static String whoWin(int n) {
		if (n < 5) {
			return n == 0 || n == 2 ? "后手" : "先手";
		}
		// 进到这个过程里来,当前的先手,先选
		int want = 1;
		while (want <= n) {
			if (whoWin(n - want).equals("后手")) {
				return "先手";
			}
			if (want <= (n / 4)) {
				want *= 4;
			} else {
				break;
			}
		}
		return "后手";
	}

	public static String winner1(int n) {
		if (n < 5) {
			return (n == 0 || n == 2) ? "后手" : "先手";
		}
		int base = 1;
		while (base <= n) {
			if (winner1(n - base).equals("后手")) {
				return "先手";
			}
			if (base > n / 4) { // 防止base*4之后溢出
				break;
			}
			base *= 4;
		}
		return "后手";
	}

	public static String winner2(int n) {
		if (n % 5 == 0 || n % 5 == 2) {
			return "后手";
		} else {
			return "先手";
		}
	}

题目三

定义一种数:可以表示成若干(数量>1)连续正数和的数

比如:

5 = 2+35就是这样的数

12 = 3+4+512就是这样的数

1不是这样的数,因为要求数量大于1个、连续正数和

2 = 1 + 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值