题目一:
给你一个非负整数 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];
}