![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法天天练
Danli.
努力成为一名自律并且不断进步的程序媛。
展开
-
【算法天天练】第一个错误版本问题(二分查找)
个人解题思路:通过二分查找不断缩小查找范围,分为以下几种情况:取中间值mid,判断mid所在的版本调用完接口后是否为错误版本1.是错误版本,判断它的前一个版本是否为错误版本,是则继续缩小查找范围,不是则mid为第一个错误版本,return出来2.不是错误版本,继续缩小查找范围,重复1直至找到第一个错误版本自己实现的代码var solution = function(isBadVersion) { /** * @param {integer} n Total versions原创 2021-08-10 15:45:30 · 70 阅读 · 0 评论 -
【算法天天练】删除链表倒数第N个结点 问题
涉及到的知识点:1.链表删除问题:前驱、后继2.给定一个链表,那链表的第一个元素该如何表示:通常给一个虚拟头结点,便于解决要删除实际头结点的情况解题思路:快慢指针法(在上一篇算法题也有提及到:【算法天天练】寻找链表中间结点问题)双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。//倘若head=[1,2,3,4,5] n=2var removeNthFromEnd = function(.原创 2021-08-09 10:03:14 · 72 阅读 · 0 评论 -
【算法天天练】寻找链表中间结点问题
个人解题思路:先求出整个链表的表长,再除以2,得到链表的中间位置。此时我就卡在了如何获取这个数组??(cai本cai下面会提到,其实通过指针的移动来将数据存入到新建的一个数组里就可以了借鉴他人解决方法:方法一:数组法由于链表无法用下标来获取数据,所以只能通过指针的移动来将数据存入到新建的一个数组A里;此时结束循环的条件是数组的最后一个数据的next指针指向的数据为空。接着算出数组A的长度,即中间节点为A.length /2,即获取到中间结点的值为 A[A.length/2]若遇到长度不能被2.原创 2021-08-06 09:35:35 · 180 阅读 · 0 评论 -
【算法天天练】反转字符串中的单词问题
个人解题思路:split()方法以空格为"分割符"分割字符串后,在分割出来后的数组再遍历其子数组,在子数组用第三方暂存值的方法反转字符串。存在问题:如何获取数组的子数组?例如let p = s.split(" ")//结果是 ["Let's","take","LeetCode","contest"]再将p的每个数据变成数组(即子数组),接着在子数组用第三方暂存值的方法反转字符串。其中,将p的每个数据变成数组(即子数组),这一步骤怎么实现?还不知道…(cai)或者有朋友可以告诉我,欢迎评论.原创 2021-08-05 10:24:53 · 82 阅读 · 0 评论 -
【算法天天练】两数相加等于目标值问题
解题思路:若题目所给的数组是升序数组,那么可以采用双指针的思想去解决,在往期博客有写到【算法天天练】两数相加等于目标值+有序数组问题但是此题目所给的数组(这里标为A)是无序的,所以解题思路会有所变化:将目标值target 减去 索引为0的首个数 nums[0] ,将所得值放进一个新数组B,再用 indexOf() 方法去查找数组B里有无数组A的值,如此循环反复,直至 i == nums.length,若无则返回 -1 .这篇文章可查看indexOf() 方法参数,返回值都是什么:Js:indexO.原创 2021-08-04 15:01:11 · 168 阅读 · 0 评论 -
【算法天天练】反转字符串问题
个人解题思路:双指针问题,指针 i 指向头部,指针 j 指向尾部,当i<=j,进入循环:两个指针下的值两两交换。在两两交换时借助第三方暂存值,我这里是设置mid来暂存值,不然得不到自己想要的交换结果。(做题时脑子一直卡住了,后面才恍然大悟,借助一个暂存地方不就得了吗(捂脸))代码如下:var reverseString = function(s) { let left =0,right=s.length-1,mid; while(left <= right){ .原创 2021-08-01 16:32:22 · 78 阅读 · 0 评论 -
【算法天天练】两数相加等于目标值+有序数组问题
个人思路:A+B = target设numbers[0]为A,for循环numbers[1]及后面的数据,枚举是否符合A+B=target 的B值,若无,则设numbers[1]为A,for循环numbers[2]及后面的数据,枚举是否有符合A+B = target的B值,以此类推。这样的方法显然是很暴力的,倘若题目所给的数组的数据很庞大,那么此解题思路根本不实用。时间复杂度为O(n2)优化解题思路抓关键字 “升序排列的数组” ==>有可能会涉及到二分法/折半查找/双指针先分成三种情况.原创 2021-08-01 15:25:25 · 124 阅读 · 0 评论 -
【算法天天练】移动零问题
个人解题思路:抽象成双指针问题,指针 i 指向头部,指针 j 指向尾部,当nums[i]==0 时,操作完将nums[i]取出来再插入到数组尾部,此时 j 要向前移动一位,然后再继续重复上一步动作(比较索引值是否为0),若nums[i] 不为0,i 向后移动一位,再重复上一步动作,直至当指针 i 与指针 j 相等,即已经遍历完整个数组,结束。需注意:每次比较当前索引的值时,若为0,则插入数组的最尾部,此时nums数组是会产生变化的。不能直接i++,因为会忽略到变化后数组中索引为 i 的值,而是需要辅助 .原创 2021-08-01 11:01:31 · 85 阅读 · 0 评论 -
【算法天天练】Rotate Array 旋转数组
难度:中等个人解题思路:把数组排在最后的值不断往数组头部拿,拿的次数是k次。var rotate = function(nums, k) { for(let i = 0 ; i<k ; i++){ nums.unshift(nums.pop()) } return nums};但是执行的结果显示不知道是什么原因…借鉴他人解法:思路:对于数组nums,向右移动k位移,等价于将原数组第nums.length-k位置到末尾移动到前面var原创 2021-07-30 15:39:38 · 100 阅读 · 0 评论 -
【算法天天练】双指针:有序数组的平方
个人解题思路:将一个数组里面的数据完成平方,再一个个插入新数组,在插入的过程中做一个有序排序。但实际操作的时候卡在了第二步,如何将新数组有序排序呢??经借鉴他人解题方法,才恍然大悟,需要采用 “双指针” 思想,先比较指针所指向的数据的绝对值(Math.abs方法)进行比较,将大的数值平方后插入新数组的头部(unshift方法)。期间,指针移动(移动规律:若是尾指针的值插入到新数组,尾指针需向前移动;若是头指针的值插入到新数组,则头指针需向后移动),直至旧数组的值全部插入新数组完成。var sorte.原创 2021-07-30 11:06:17 · 104 阅读 · 0 评论 -
【算法天天练】二分查找(折半查找)+动态搜索插值
难度:简单题意抽象化:在一个有序数组里查找目标值是否存在首先想到的解题思路:for循环数组,一一去比较目标值是否在数组里存在:for(let i =0 ;i<nums.length;i++){ if(target === nums[i]){ return [i]}....//省略其实这种解题思路是非常低效的,我们要学会抓取题目关键字:有序整型数组,由于数组是有序的,我们可以用二分查找的方法来解决。//正确高效解题思路var search = function(nums, t原创 2021-07-28 13:58:26 · 153 阅读 · 0 评论