算法篇:剑指Offer打卡(一)

大家好,我是杜晓帅~,最近又划了几天水,感觉离大厂又远了一步,每思念至此,常感觉自己是个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();
	}
}

二.剑指 Offer 05. 替换空格

思路:可以用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();
    }
}

三.剑指 Offer 58 - II. 左旋转字符串

思路:这道题用substring函数可以很快,将字符串截取拼接一下就可以,使用方法可以去百度一下

代码如下:

class Solution {
    public String reverseLeftWords(String s, int n) {
        return s.substring(n) + s.substring(0, n);
    }
}

四.剑指 Offer 03. 数组中重复的数字

思路:只需要找到第一个重复的元素就可以返回了,而且数据范围也不大,可以直接开一个数组,打表就可以,重复的元素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;
    }
}

五.剑指 Offer 11. 旋转数组的最小数字

思路:这题本着能过的心态,直接查最小值了,但是为了时间复杂度的朋友还是别这样了,这样肯定不是最优解

代码如下:

class Solution {
    public int minArray(int[] numbers) {
        Arrays.sort(numbers);
        return numbers[0];
    }
}

六.剑指 Offer 50. 第一个只出现一次的字符

思路:第一次出现的元素即是最后一次出现的元素(偷懒做法)

代码如下:

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 ' ';
    }
}

七.剑指 Offer 04. 二维数组中的查找

思路:本来可以一个一个遍历,然后找出来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;
    }
}

今天的打卡就到这了(其实是因为楼下的超市快关门了,再写就没得饭吃了),下次继续打卡,为了春招,冲啊!!!

在这里插入图片描述

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值