剑指offer------Day1

Posted Recently 祝祝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer------Day1相关的知识,希望对你有一定的参考价值。

Arrays.sort()
Arrays.toString()
StringBuffer.append()
++st[nums[i]]
String,charAt()

登录力扣,点击题单,选择剑指offer(第二版),开始我的刷题之旅了

算法,作为一个程序员应该十分能理解这两个字的含义(进入大厂必备技能),除非你没有一颗进大厂的心,一开始的我是这样的,但是后来因为一些缘故,我必须要提升自己的技能,这样才能遇到志同道合的人跟你一起并肩作战。如果你还没毕业建议你多了解算法,如果你毕业了那么朋友卷起来。

Day1,先来前边几道题

没做之前是这样的,因为我之前确实没刷过,然后进了国企,说实话国企的氛围真的很不错,没有职场上的尔虞我诈,但是这里提升真的很慢,如果你是一个卷人,那么你可以选择跳一跳了,国企里的生活,项目忙的时候是真的忙,闲的时候也是真的闲,我是那种不喜欢加班的人所以一到点我就会走了,这样就有更多时间做自己想做的事情了。在职场上还是需要能抗打一些的,如果你不抗打,那么就会偶尔遇到什么事情心情就会很低落,这就会让你在乐观的道路上越走越远,这是绝对不行的,因为爱笑的女孩子会很幸运哦(这部分送给程序媛们)

练前了解学习

刚开始练的时候还是建议先了解一下:
二叉树,数组,链表,队列,栈,哈希表的使用,HashMap,二分查找,递归,回溯,贪心,动态规划
这个就很不错:代码随想录

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

力扣链接:剑指 Offer 03. 数组中重复的数字
看到这道题然后我想到的就挺复杂的解法,后来看到帅地的解法,觉得这种简单的解法太适合我了,太久没有硬是编程了,然后提交了好几遍才通过

题目:在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

题解:这一题最重要的是排序Arrays.sort(nums);排序后前后比较,要是相等就返回,他只需要输出一个重复数字

class Solution 
    public int findRepeatNumber(int[] nums) 
        Arrays.sort(nums);
        for(int i=0;i<nums.length-1;i++)
            if(nums[i]==nums[i+1])return nums[i];
        
        return -1;
    

喜欢这个解法:

class Solution 
    public int findRepeatNumber(int[] nums) 
        int n = nums.length;
        int[] st = new int[n + 1];
        for(int i = 0; i < n; i++) 
            if(++st[nums[i]] > 1) return nums[i];
        
        return -1;
    

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

力扣链接:剑指 Offer 04. 二维数组中的查找
这题我还是喜欢自己的左右指针写法,看了其他的感觉太复杂了,双指针写法可以让思路更清晰。

题目:在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

.
题解:使用二分法的思路,判断比较,比目标值大数值往右移,比目标值小数值往左移,一次只判断一位数。行数:matrix.length;列数:matrix【0】.length;循环需要注意一下,行小于行数-1,列需要大于0

class Solution 
    public boolean findNumberIn2DArray(int[][] matrix, int target) 
        if(matrix==null||matrix.length==0||matrix[0].length==0)return false;
        int rows =matrix.length;
        int left =matrix[0].length-1;
        int right=0;
        while(right<=rows-1 && left>=0)
            if(matrix[right][left]==target)
                return true;
            else if(matrix[right][left]<target)
                        right++;
            else
                left--;
            
        
            return false;
    

Day1:剑指 Offer 05. 替换空格

力扣题目:剑指 Offer 05. 替换空格
这个就比较简单了,可以产生很多思路

题解:遍历字符串,生成一个StringBuffer 字符序列,判断若为空格将“%20”append进去,否则append原本的数值

class Solution 
    public String replaceSpace(String s) 
        StringBuffer sb  = new  StringBuffer();
        for(int i=0;i<s.length();i++)
            if(s.charAt(i)==' ')
                sb.append("%20");
            else
                sb.append(s.charAt(i));
            
    
     return sb.toString();
 

Day1:剑指 Offer 06. 从尾到头打印链表

力扣题目:剑指 Offer 06. 从尾到头打印链表
我不知道有没有人跟我一样觉得链表挺好用,但是看到链表又有一些慌的,可能是当时在学校的时候,老师把它神话了,以至于我现在看到它如此的慌张,有没有人跟我一样拿到这种题就想着遍历,结果看人家需要输出的是啥数组,存进去不就行了

题目:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

题解:遍历一遍链表得到链表长度,创建数组,从数组最后一个值开始存放,将链表从第一个值开始放进去

/**
 * Definition for singly-linked list.
 * public class ListNode 
 *     int val;
 *     ListNode next;
 *     ListNode(int x)  val = x; 
 * 
 */
class Solution 
  public int[] reversePrint(ListNode head) 
        ListNode  temp = head;
        int len =0;
        while(temp !=null)
            len++;
            temp = temp.next;
        
        int[]  nums = new int[len];
        temp =head;
        while(temp !=null)
            nums[--len]=temp.val;
            temp = temp.next;
        
        return nums;
    

今天的剑指offer完成,常练真的有好处,脑子都变得灵活多了,逻辑思维能力都能变强

以上是关于剑指offer------Day1的主要内容,如果未能解决你的问题,请参考以下文章

力扣剑指offer(day1 链表)

力扣剑指offer(day1 链表)

剑指Offer滑动窗口的最大值(笔试&面试解法)

剑指Offer滑动窗口的最大值(笔试&面试解法)

剑指offer 反转链表

(剑指offer)丑数 JavaScript解法