作者:TeddyZhang,公众号:算法工程师之路 Day 7, 数据结构知识点走起~ 1 编程题 【剑指Offer】调整数组顺序使奇数放在偶数之前 输入一个整数数组,实现一个函数来调整该数组中数字的顺序 当然可以,由于题目要求奇数和偶数的相对顺序保持不变,也就是排序的稳定性,而经过我们之前对常用排序算法的了解,知道插入排序是稳定的! int val; 4 struct ListNode *next; 5 ListNode(int x) : 6 val(x), next(NULL) { 7 pHead=pHead->next; pTail=pTail->next; } return pTail; } }; 2 概念题 我们在实现图的创建和遍历算法时,提到了度的概念,对于图中的节点,度数=入度+出度,其中入度是指有多少个节点指向该节点,而出度是指从该节点出发指向了多少个节点!
请必须使用时间复杂度为 O(log n) 的算法。 right = mid - 1; } } return left; } }; 4.运行结果 总结 今天是算法练习的第 7天。
World'); for (let word of helloWorld) { console.log(word); } // -> should log 'Hello' and 'World' 挑战7 题解: // CHALLENGE 7 function valueAndPrevIndex(array){ const iteratedArray = array[Symbol.iterator](
我扫了一眼代码,心想这题挺经典的,来,我给你捋一捋。 ##算法题:Word Break 题目理解 题目说给你一个字符串 s 和一个单词列表 wordDict。 这题的关键点在于理解动态规划的状态转移。dp[i] 表示前 i 个字符能否拆分,如果某个位置 j 之前能拆分,而且 s[j:i] 是字典里的词,那 dp[i] 就能拆分。
我扫了一眼代码,心想这题挺经典的,来,我给你捋一捋。 ##算法题:House Robber 题目理解 题目说你是专业小偷,计划偷窃沿街的房屋。 偷第1和第3家,1+3=4 输入 [2,7,9,3,1],输出 12。偷第1、3、5家,2+9+1=12 说白了就是:选一些数,这些数不能相邻,要让它们的和最大。 func main() { // 测试用例 fmt.Println(rob([]int{1, 2, 3, 1})) // 4 fmt.Println(rob([]int{2, 7, 这题的关键点在于理解动态规划的状态转移。每家有两种选择:偷或不偷。如果偷这一家,上一家就不能偷,所以是dp[i-2]+nums[i]。如果不偷这一家,就是dp[i-1]。取两者最大值就是最优解。
我扫了一眼代码,心想这题挺经典的,来,我给你捋一捋。 ##算法题:Best Time to Buy and Sell Stock 题目理解 题目说给你一个数组 prices,prices[i] 是第 i 天的股票价格。 设计算法计算你能获取的最大利润。 注意不能在买入前卖出,也就是买入日期必须在卖出日期之前。 举例说明: 输入 [7,1,5,3,6,4],输出 5。 第2天买入(价格1),第5天卖出(价格6),利润5 输入 [7,6,4,3,1],输出 0。价格一直在跌,不买最合适 说白了就是:找一个最低的买入价和一个最高的卖出价,让它们的差最大。 这题的关键点在于理解一次遍历的思路。我们要找最低的买入价和最高的卖出价,但不能简单找最小值和最大值,因为买入必须在卖出之前。所以要用一次遍历,维护历史最低价,同时计算每次卖出的利润。
# 七、描述一个运行时间为O(nlgn)的算法,给定n个整数的集合S和另一个整数,该算法能确定 S中是否存在两个其和刚好为工的元素。 文心一言: 这里是一个运行时间为O(nlgn)的算法,可以用来确定集合 S 中是否存在两个元素,它们的和恰好为工。 chatgpt: 一个运行时间为O(nlgn)的算法是先对集合S进行排序,然后使用双指针算法从集合的两端开始向中间扫描。初始化左右指针分别指向S的第一个和最后一个元素。
引言:当你作为一个初学Java算法题的小白,可以点进来看看我这些算法基础题,能够很好的帮助你打好算法基本功。打好基础,才能更上一层楼。速速开始学起这些算法题吧! sc.nextLine().replace(" ",""); System.out.println(Integer.valueOf(c)); sc.close(); } } 7: System.out.println((int)(Math.pow(x,6)+3*Math.pow(x,4)-2*Math.pow(x,5)-5*Math.pow(x,2)+6*x+7)
前言 本文记录了我对打印算法题的总结。先说说什么事打印算法题,就是按照一定的规则打印二维矩阵。 2 9 10 11 12 15 11 7 3 13 14 15 16 16 12 8 4 接下来,将会有几道打印算法题 例如: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ========= 13 9 5 1 14 10 6 2 15 11 7 3 16 12 8 4 例如:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 打印结果为:1,2,3,4,8,12,16,15,14,13,9, 5,6,7,11, 10 【要求】 额外空间复杂度为 例如在第一二道题,我们都是通过解决外矩阵后,再解决内矩阵的方式解决问题的。 2、设计一个子模块打印函数 例如给定左上角和右上角打印一个矩阵等打印函数,记住一些常用的打印函数,可以让我们更快地解决问题
序列的变化情况采样如下: 20,15,21,25,47,27,68,35,84 15,20,21,25,35,27,47,68,84 15,20,21,25,27,35,47,68,84 请问采用的是以下哪种排序算法
# 四、2 ^ (n+1)=O(2 ^ n)成立吗? 2^(2n)=O(2 ^ n)成立吗? 文心一言: chatgpt: 第一个式子不成立,第二个式子成立。 1. 2 ^ (n+1) = O(2 ^
为了求出岛屿的数量,我们可以扫描整个二维网格。如果一个位置为 11,则以其为起始节点开始进行深度优先搜索。在深度优先搜索的过程中,每个搜索到的 11
面试发现自己的算法知识有不足,因此参考了多篇文章学习总结。 冒泡排序 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较 冒泡排序最好的时间复杂度为O(n),是一种稳定排序算法。 快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。 不指定算法的数组排序 let arr = [16, 31, 12, 1, 9, 12, 10]; arr.sort((a, b) => a - b); // 从小到大 4. 譬如[7, 8, 4, 9, 9, 15, 3, 1, 10]这个数组的计算值是 11 ( 15 - 4 ) 而不是 14 (15 - 1),因为 15 的下标小于 1。
为了求出岛屿的数量,我们可以扫描整个二维网格。如果一个位置为 11,则以其为起始节点开始进行深度优先搜索。在深度优先搜索的过程中,每个搜索到的 11
#include <stdio.h> #include <string.h> #define MAX 1000 struct Node{ int v,net; }; struct Node node[MAX]; int main(){ int n,e,t,i,x,y,z,head[MAX],que[MAX],map[MAX/2][MAX/2],qh,qt; while(scanf("%d %d",&n,&e)!=EOF){ memset(head,-1,sizeof(head)); for(i = 0;i < e;i++){ scanf("%d %d",&x,&y); node[i].v = y; node[i].net = head[x]; head[x] = i; } scanf("%d",&t); while(t--){ z = 0; memset(map,0,sizeof(map)); qh = qt = 1; scanf("%d %d",&x,&y); if(x == y){ printf("yes\n"); continue; } que[qt++] = x; while(qh < qt){ for(i = head[que[qh]];i != -1;i = node[i].net){ if(map[que[qh]][node[i].v] == 0){ map[que[qh]][node[i].v] = 1; que[qt++] = node[i].v; } if(node[i].v == y){ z = 1; break; } } if(z == 1) break; qh++; } if(z == 1) printf("yes\n"); else printf("no\n"); } printf("\n"); } return 0; }
输出描述: 输出该数值的近似整数值 输入:5.5 输出:6 说明:0.5>=0.5,所以5.5需要向上取整为6 输入:2.499 输出:2 说明:0.499<0.5,2.499向下取整为2 7.
# LeetCode 算法题 简单 两数之和 回文数 罗马数字转整数 合并两个有序链表 每天一道,没坚持下去 # 简单 # 两数之和 题目地址 (opens new window) 给定一个整数数组 示例 1: 输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。 算法 我们直接将以上递归过程建模,同时需要考虑边界情况。 如果 l1 或者 l2 一开始就是空链表 ,那么没有任何操作需要合并,所以我们只需要返回非空链表。 方法二:迭代 思路 我们可以用迭代的方法来实现上述算法。 算法 首先,我们设定一个哨兵节点 prehead ,这可以在最后让我们比较容易地返回合并后的链表。我们维护一个 prev 指针,我们需要做的是调整它的 next 指针。
---- 摘自传智播客公开课 ---- package test; import java.util.Scanner; public class Arithmetic3 { //题设 break; case 6: System.out.println("中老年"); break; case 7:
算法题目 题目:打印出所有的 “水仙花数 “,所谓 “水仙花数 “是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 “水仙花数 “,因为153=1的三次方+5的三次方+3的三次方。 算法分析 根据题目分析,水仙花是三位数是 个位+十位+百位 自身次方等于该数本身,那么计算一个数是否是水仙花数要将这个数的 个位数 十位数 百位数给分解出来伪代码如下: a = i/100; 10; //获取3位数中十位的数 c=i%100%10; //获取3位数中个位的数 这样就可以通过循环来过滤出一个区间的水仙花数量了 算法
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。