第一题:
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
提供了两种办法,一种是二分查找,另一种则用到了其他内置函数 exp
public class Solution {
public int mySqrt(int x) {
if(x==0){
return 0;
}
if(x==1){
return 1;
}
int l = 1;
int r = x/2;
while (l <= r) {
int mid = l + ((r - l + 1) >>> 1);
if (mid > x/mid) {
r = mid - 1;
} else {
l = mid+1;
}
}
return r;
}
public int mySqrt1(int x) {
if (x == 0) {
return 0;
}
int ans = (int) Math.exp(0.5 * Math.log(x));
return (long) (ans + 1) * (ans + 1) <= x ? ans + 1 : ans;
}
}
第二题:
给你一个排序后的字符列表 letters ,列表中只包含小写英文字母。另给出一个目标字母 target,请你寻找在这一有序列表里比目标字母大的最小字母。
在比较时,字母是依序循环出现的。举个例子:
如果目标字母 target = 'z' 并且字符列表为 letters = ['a', 'b'],则答案返回 'a'
class Solution {
public char nextGreatestLetter(char[] letters, char target) {
int l = 0;
int r = letters.length;
int n = r;
while(l<r){
int mid = l+((r-l)>>>1);
if(letters[mid]>target){
r = mid;
}else{
l=mid+1;
}
}
return letters[r%n];
}
}