大家好,我是杜晓帅~,最近又划了几天水,感觉离大厂又远了一步,每思念至此,常感觉自己是个fw,所以还是要学习啊!!!
俗话说:算法不行,面大厂的机会都没有,所以先把剑指Offer刷一遍吧!
话不多刷,打开了LeetCode找到剑指Offer开刷,然后第一题就没看懂题,心中又默念一遍,我是fw,但是既然开始了,就别轻易放弃了
题目如下:
一.剑指 Offer 09. 用两个栈实现队列
思路:本题主要考察队列和栈的知识,只需知道队列是先进先出、栈是先进后出的就可以使用栈使用队列了(先用栈存储所有元素,再用另外一个栈翻转过来就是队列的先入先出顺序了)
代码如下:
class CQueue {
LinkedList<Integer> s1;
LinkedList<Integer> s2;
public CQueue() {
s1 = new LinkedList<>();
s2 = new LinkedList<>();
}
//将元素入栈
public void appendTail(int value) {
s1.add(value);
}
//删除元素时,需要将s1中的元素翻转到s2中才能像队列一样的删除顺序
public int deleteHead() {
if (s2.isEmpty()) {
if (s1.isEmpty()) return -1;
while (!s1.isEmpty()) {
s2.add(s1.pop());
}
return s2.pop();
} else return s2.pop();
}
}
思路:可以用replace替换,也可以定义字符串拼接,遇到空格拼接字符"%20"即可
代码如下:
class Solution {
public String replaceSpace(String s) {
StringBuilder stringBuilder = new StringBuilder();
for (char c : s.toCharArray()){
if (c == ' '){
stringBuilder.append("%20");
}else {
stringBuilder.append(c);
}
}
return stringBuilder.toString();
}
}
思路:这道题用substring函数可以很快,将字符串截取拼接一下就可以,使用方法可以去百度一下
代码如下:
class Solution {
public String reverseLeftWords(String s, int n) {
return s.substring(n) + s.substring(0, n);
}
}
思路:只需要找到第一个重复的元素就可以返回了,而且数据范围也不大,可以直接开一个数组,打表就可以,重复的元素return返回即可
代码如下:
class Solution {
public int findRepeatNumber(int[] nums) {
int[] arrays = new int[nums.length];
for(int i : nums){
arrays[i]++;
if(arrays[i] == 2){
return i;
}
}
return -1;
}
}
思路:这题本着能过的心态,直接查最小值了,但是为了时间复杂度的朋友还是别这样了,这样肯定不是最优解
代码如下:
class Solution {
public int minArray(int[] numbers) {
Arrays.sort(numbers);
return numbers[0];
}
}
思路:第一次出现的元素即是最后一次出现的元素(偷懒做法)
代码如下:
class Solution {
public char firstUniqChar(String s) {
if(s.isEmpty()){
return ' ';
}
for(char c : s.toCharArray()){
//传入一个字符,indexOf会返回第一个出现的位置,lastIndexOf会返回最后一次出现的位置,
//第一次和最后一次出现的位置一样即为只出现一次的字符
if(s.indexOf(c) == s.lastIndexOf(c)){
return c;
}
}
return ' ';
}
}
思路:本来可以一个一个遍历,然后找出来target,但是时间复杂度太高了,也不是出这道题的目的,所以采用了定位的方法减少了一些无关元素的判定,用缩小范围的方法查找目标元素(有人说这是BST,大家可以去看看)
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if(matrix.length == 0){
return false;
}
int n = 0,m = matrix[0].length-1;
while (n<matrix.length && m>=0){
if(target == matrix[n][m]){
return true;
}
else if(target > matrix[n][m]){
n++;
}else if(target < matrix[n][m]){
m--;
}
}
return false;
}
}
八.剑指 Offer 53 - II. 0~n-1中缺失的数字
思路:当我们看到一个数组是有序的,并且需要查找一个元素,基本就要想到,该用二分法了(其实用遍历的方法可以偷懒,也可以过,但是好像失去了做这道题的意义了,感觉没什么收获,有点浪费时间,所以有时间尽量还是多想想用更优的方法解决这道题)
代码如下:
class Solution {
public int missingNumber(int[] nums) {
if(nums[0] == 1) return 0;
int i = 0 , j = nums.length - 1;
while(i<=j){
//二分法先选取中间元素,只要前面的元素缺少了会往左边走,后面的元素缺少了会往右边走,
//直到定位到缺失的元素为止
int mid = (i+j)>>1;
if(nums[mid] == mid){
i = mid + 1;
}else{
j = mid - 1;
}
}
return i;
}
}
今天的打卡就到这了(其实是因为楼下的超市快关门了,再写就没得饭吃了),下次继续打卡,为了春招,冲啊!!!