扑克牌顺子,圆圈中最后剩下的数, 股票的最大利润,求 1+2+3+...+n

题目描述
五张牌,其中大小鬼为癞子,牌面为 0。判断这五张牌是否能组成顺子。
解题思路
先对数组进行排序,然后找到癞子的数量,然后如果又相同的除了零之外的返回false,然后癞子来补齐扑克牌,看是否是顺子

package com.xhh.offer;

import java.util.Arrays;

/**
 * 扑克牌顺子
 * 
 * @author xhh
 *
 */
public class SixtyOne {
	public static boolean isContinuous(int[] nums) {
		if (nums.length < 5) {
			return false;
		}
		Arrays.sort(nums);
		// 统计癞子出现的次数
		int count = 0;
		for (int i : nums) {
			if (i == 0) {
				count++;
			}
		}
		for (int i = 0; i < nums.length - 1; i++) {
			if (nums[i] == nums[i + 1] && nums[i] != 0 && nums[i + 1] != 0) {
				return false;
			}
			count -= nums[i + 1] - nums[i] - 1;
		}
		if (count >= 0) {
			return true;
		}
		return false;
	}

	public static void main(String[] args) {
		int[] nums = { 0, 0, 3, 4, 5 };
		boolean continuous = isContinuous(nums);
		System.out.println(continuous);
	}
}

题目描述
让小朋友们围成一个大圈。然后,随机指定一个数 m,让编号为 0 的小朋友开始报数。每次喊到 m-1 的那个小朋友
要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续 0…m-1
报数 … 这样下去 … 直到剩下最后一个小朋友,可以不用表演。
解题思路
约瑟夫环,圆圈长度为 n 的解可以看成长度为 n-1 的解再加上报数的长度 m。因为是圆圈,所以最后需要对 n 取
余。

/**
 * 圆圈中最后剩下的数
 * 
 * @author xhh
 *
 */
public class SixtyTwo {
	public int LastRemaining_Solution(int n, int m) {
		if (n == 0) {
			return -1;
		}
		if (n == 1) {
			return 0;
		}
		return (LastRemaining_Solution(n - 1, m) + m) % n;
	}
}

题目描述
可以有一次买入和一次卖出,买入必须在前。求最大收益。
解题思路
使用贪心策略,假设第 i 轮进行卖出操作,买入操作价格应该在 i 之前并且价格最低。

package com.xhh.offer;

/**
 * 股票的最大利润
 * 
 * @author xhh
 *
 */
public class SixThree {
	public int maxProfit(int[] prices) {
		if (prices.length == 0 || prices == null) {
			return 0;
		}
		int minBuy = prices[0];
		int maxProfit = 0;
		for (int i = 0; i < prices.length; i++) {
			minBuy = Math.min(minBuy, prices[i]);
			maxProfit = Math.max(maxProfit, prices[i] - minBuy);
		}
		return maxProfit;
	}
}

求 1+2+3+…+n

package com.xhh.offer;

/**
 * 求 1+2+3+...+n
 * 
 * @author xhh
 *
 */
//常规的写法
public class SixFour {
	public static int sum(int n) {
		if (n == 0) {
			return 0;
		}
		return n + sum(n - 1);
	}

//如果我们不使用if
	public static int sum1(int n) {
		int sum = n;
		boolean b = (n > 0) && ((sum += sum1(n - 1)) > 0);
		return sum;
	}
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值