算法笔记(69. x 的平方根 和744. 寻找比目标字母大的最小字母)

题目一:

给你一个非负整数 x ,计算并返回 x 的 平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
示例 1:
输入:x = 4
输出:2
示例 2:
输入:x = 8
输出:2
解释:8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。

题解一:字符串解法

public static int mySqrt(int x) {
        double sqrt = Math.sqrt(x);
        String str = sqrt+"";
        if (str.contains(".")){
            str = str.substring(0,str.indexOf("."));
        }
        return Integer.valueOf(str);
    }

题解二:直接二分查找变种

 public static int mySqrt1(int x){
        int low = 0, high = x, ans = -1;
        while (low <= high){
            int mid = low + ((high - low)>>1);
            if ((long) mid*mid <= x){
                ans = mid;
                low = mid + 1;
            }else high = mid - 1;
        }
        return ans;
    }

题目二:

744. 寻找比目标字母大的最小字母
给你一个排序后的字符列表 letters ,列表中只包含小写英文字母。另给出一个目标字母 target,请你寻找在这一有序列表里比目标字母大的最小字母。
在比较时,字母是依序循环出现的。举个例子:
如果目标字母 target = 'z' 并且字符列表为 letters = ['a', 'b'],则答案返回 'a'
示例 1:
输入: letters = ["c", "f", "j"],target = "a"
输出: "c"
示例 2:
输入: letters = ["c","f","j"], target = "c"
输出: "f"
示例 3:
输入: letters = ["c","f","j"], target = "d"
输出: "f"

题解一:二分查找

 public char nextGreatestLetter(char[] letters, char target) {
        int n = letters.length;
        if (target >= letters[n-1]){
            return letters[0];
        }
        int low = 0, high = n-1;
        while (low < high){
            int mid = low + ((high-low)>>1);
            if (letters[mid] > target){
                high = mid;
            }else {
                low = mid + 1;
            }
        }

        return letters[low];
    }

题解二:一次循环

public char nextGreatestLetter1(char[] letters, char target) {
        for (char letter : letters) {
            if (letter > target){
                return letter;
            }
        }
        return letters[0];
    }

题解三:HashSet霸王硬上弓

public char nextGreatestLetter2(char[] letters, char target) {
        int ll = letters.length;
        Set<Character> set = new HashSet<>();
        for (int i=0;i<ll;i++){
            set.add(letters[i]);
        }
        set.add(target);
        char [] letFa = new char[set.size()];
        int j = 0;
        for (Character c : set) {
            letFa[j] = c;
            j++;
        }
        Arrays.sort(letFa);
        for (int i=0;i<set.size();i++){
            if (target==letFa[i]) {
                if (i==set.size()-1)return letters[0];
                else return letFa[i+1];
            }
        }
        return letters[0];
    }

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值