第三天——
今天复习了一下第一天学的内容,还可以,记住一道半。
就先简单暴力地学一天复习前两天学过的内容吧,后面有调整再说。
一. x的平方根
题目链接:力扣
思路:
本题要求出算术平方根的整数部分,而舍弃小数部分。也就是说在 k² = x的情况下,求出k。那就可以对k进行二分查找,进而不断地逼近k,最终求得。
光听可能还是差点意思,直接上代码。
代码:
class Solution {
public int mySqrt(int x) {
int left = 0;
int right = x;
//结果先设为-1
int ans = -1;
while(left <= right){
//求中值
int mid = left + (right - left) / 2;
//利用中值法,不断地逼近要求得的ans
//k² <= x,那么要求k,就可以通过二分
if((long) mid * mid <= x) {
ans = mid;
left = mid + 1;
} else {
right = mid - 1;
}
}
return ans;
}
}
确实非常精妙,将数字从0~x作为数组,进而算出mid,求其算术平方根,学到了。
二. 有效的完全平方数
题目链接:力扣
思路:没啥好说的,跟上一题完全同理,真就完全同理。
只需要根据题目要求的不同稍微做一些配置上的修改。
代码:
class Solution {
public boolean isPerfectSquare(int num) {
int left = 0;
int right = num;
while(left <= right) {
int mid = left + (right - mid) / 2;
long sq = (long) mid * mid; //这里不加(long)强制类型转换会计算超时
if(sq < num) {
left = mid + 1;
} else if(sq > num) {
right = mid - 1;
} else {
return true;
}
}
return false;
}
}
三. 比较含退格的字符串
这个题其实是移除元素部分的题,确实,我也是才发现前两天没有把两个知识点附近的题也做完,现在进行一个补足。
题目链接:力扣
思路:
双指针,其实比起算法的思路,更像是对于编程基础的考察。
代码:
class Solution {
public boolean backspaceCompare(String s, String t) {
//调用equals()比较俩字符串是否相同
return convert(s).equals(convert(t));
}
private String convert(String s) {
//创建一个可变字符串
StringBuilder sb = new StringBuilder();
//创建一个char数组
char[] cs = s.toCharArray();
//size指定的是新生成的字符串的长度,也可以看做是存入字符的下标
int size = 0;
//从后往前遍历字符串
for(int i = cs.length-1; i>= 0; i--){
//如果元素为'#'
if (cs[i] == '#') {
//字符串长度++
size++;
} else if(size == 0) {
//如果长度为0,证明没有遇到'#'
//将当前元素放入到可变字符串中,变为最终字符串的一部分
sb.append(cs[i]);
} else {
//没有遇到#,size--
size--;
}
}
//可变字符串经过一系列操作后变为最终的字符串,将其返回
return sb.toString();
}
}
大概就是这样。