回文数字&&二分查找-II&&丢棋子问题

179 阅读1分钟

NC56 回文数字

题目链接

1、解题思路

while循环解决,注意边界问题。

2、代码
public boolean isPalindrome(int x) {
    if (x < 0) {
        return false;
    } else if (x == 0) {
        return true;
    } else {
        long val = 0;
        int temp = x;
        while (temp != 0) {
            val = val * 10 + temp % 10;
            temp = temp / 10;
        }
        if (val > Integer.MAX_VALUE) {
            return false;
        } else {
            return val == x;
        }
    }
}

NC105 二分查找-II

题目链接

1、解题思路

二分查找,往左逼近就好

2、代码
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 如果目标值存在返回下标,否则返回 -1
     * @param nums int整型一维数组 
     * @param target int整型 
     * @return int整型
     */
    public int search (int[] nums, int target) {
        int ans = -1;
        int l = 0;
        int r = nums.length - 1;
        while (l <= r) {
            int mid = l + (r - l) / 2;
            if (nums[mid] == target) {
                ans = mid;
                r = mid - 1;
            } else if (nums[mid] < target) {
                l = mid + 1;
            } else {
                r = mid - 1;
            }
        }
        return ans;
    }
}

NC87 丢棋子问题

题目链接

1、解题思路

当公式记住吧,就和约瑟夫环一样。

2、代码
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回最差情况下扔棋子的最小次数
     * @param n int整型 楼层数
     * @param k int整型 棋子数
     * @return int整型
     */
    private int calc(int time, int k) {
        if (time == 1 || k == 1) {
            return time + 1;
        } else {
            return calc(time - 1, k - 1) + calc(time - 1, k);
        }
    }

    public int solve(int n, int k) {
        int time = 1;
        while (calc(time, k) <= n) {
            time++;
        }
        return time;
    }
}