题目描述
五张牌,其中大小鬼为癞子,牌面为 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;
}
}