习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。...【思路】 首先想到的是肯定是暴力法,从1,2,3,…循环一直找到给定的第n个丑数,但是这种做法我记得在LeetCode是TLE的。那么有没有更elegant的方法呢?...以下思路来自《剑指offer》第34题。 既然一个个循环不可行,那么就生成第n个丑数呗。 由于丑数只包含因子2,3,5,那么我们一个丑数只乘2,3,5的话也可以得到丑数。...由于1是一个丑数,那么分别乘上2,3,5可以得2,3,5。显然,它们是丑数。但是注意4也是一个丑数,它可以由2 x 2得到。...所以丑数可以再乘以2,3,5得到下一个丑数,唯一要保证的是应该从小到大得到下一个丑数。所以要分别保留2,3,5的上一个丑数指针,下一个丑数则是三个指针所指的数值分别乘以对应的因子中的最小值。
两个有序数组,各自含有n个元素,求第n大的元素 1.顺序遍历两个数组,计数变量k统计出现的第k小元素,时间复杂度为O(n) 代码例如以下: int getmid(int a[],int b[],int...n) { int k=0; int i=0,j=0; while(i<n&&j<n) { if(a[i]<b[j]) { i++; k++; if(k==n)...数组的中间元素mid1,取B数组的中间元素mid2,先比較这两个元素的大小。...假设这两个元素相等,则直接返回A[mid1],假设A[mid1]<B[mid2],则mid1左側的元素能够去掉,B数组右側的元素能够去掉。...这里还要区分数组元素个数为偶数奇数的情况,假设元素个数为偶数,则mid1元素也要去掉。假设A[mid1]<B[mid2]的情况与此类似。
class Test4 { public static int[] merge(int[] arr1, int[] arr2) { int m = 0; int n...mergeArr = new int[arr1.length + arr2.length]; int i = 0; while (m < arr1.length || n...< arr2.length) { if(m >= arr1.length){ mergeArr[i++] = arr2[n++];...} else if(n >= arr2.length){ mergeArr[i++] = arr1[m++]; } else if(arr1[m]...< arr2[n]){ mergeArr[i++] = arr1[m++]; } else { mergeArr
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。...示例 1: 输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5] 示例 2: 输入:head = [1], n = 1 输出:[] 示例 3: 输入:head = [1,2...], n = 1 输出:[1] 提示: 链表中结点的数目为 sz 1 <= sz <= 30 0 <= Node.val <= 100 1 <= n <= sz 原题地址 /** * Definition...使用双指针 // 第一个指针先走 n 步,然后两个指针一起走,当第一个指针到达末尾的时候,第二个指针刚好指向被删除的节点位置 // 为了找到被删除的节点的上一个节点,方便删除,所以定义一个哑结点,作为...// 先将第一个指针走 n 步 for(let i=0;i<n;i++){ first = first.next; } // 两个指针同时走,当 first节点不存在
) 编写一个程序,找出第 n 个丑数。...Note: 1 is typically treated as an ugly number. n does not exceed 1690. 理解 方法1 时间复杂度:o(n3) ?...Coin Change 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。...,从len-1开始 { // pop_heap() 从堆中取出一个元素 Swap(a[0],a[j]);//交换首尾元素,将最大值交换到数组的最后位置保存...// push_heap() 将一个元素推进堆内 Heap_build(a,0,j);//去除最后位置的元素重新建堆,此处j表示数组的长度,最后一个位置下标变为len-2 }
题意 找到单链表倒数第 n 个节点,保证链表中节点的最少数量为 n 。...样例 给出链表 3->2->1->5->null 和 n = 2,返回倒数第二个节点的值 1 思路1 一个简单的思路就是先将链表进行反转,然后在反转后的链表中,顺着找第 n 个元素即可。...例如对于 100 个元素的链表,查找倒数第 100 个,那么就等于将链表遍历了 2 次,效率很低。...改进思路: 设 2 个指针 p1, p2 先让指针 p2 指向顺数第 n 个元素,p1 指向原链表的头指针。...然后 p1 和 p2 一起向后移动,直到 p2 指向 NULL,此时 p1 就会指向倒数第 n 个元素上。 代码实现2 /** * Definition for ListNode.
https://blog.csdn.net/zy010101/article/details/80079784 #include #include //求第n...个到第m个素数的和 int main() { int n,m; int flag = 0; int sum = 0; int j = 0; int isPrime_1(int n); scanf...("%d %d",&a,&b); for(int i = 2; flag < m; i++) //控制循环只找到第m个素数 { j = isPrime_1(i); if (0 ==...j) { continue; } else { flag++; //素数计数器,表示是第几个素数 if(flag >= n) //从第n个素数开始求和...//是素数返回1,否则返回0 { int i = sqrt(n); int a = 1; for(int j = 2; j <= i; j++) { if(0 == n % j)
只包含2、3、5中的1个或多个因子的数称为丑数,要求按从小到大的顺序找到第n个丑数 ''' 2, 3, 5 6: 是丑数 14: 不是丑数,包含7 下一个丑数必定是数组的某一个丑数A * 2、B *
1 #include 2 #include 3 using namespace std; 4 5 int nth_prime(int n) { 6...vector primes(n); 7 primes[0] = 2; 8 int CntOfPrime = 1; 9 for (int i = 3; CntOfPrime <...n; ++i) { 10 bool isPrime = true; 11 for (int j = 0; j < CntOfPrime && primes[j]*primes[j] <...isPrime) { 18 ++CntOfPrime; 19 primes[CntOfPrime - 1] = i; 20 } 21 } 22 return primes[n...- 1]; 23 } 24 25 int main() { 26 int n; 27 while (cin >> n) { 28 cout << nth_prime(n) << endl
场景: 话不多说直接上代码 1.数组中删除某个值 let arr = [1,2,3,4,5,6]//原数组 ,删除其中的2 arr = arr.filter(item => item !...= 2) console.log(arr) 2.一个数组删除包含的另一个数组 let arr = [1,2,3,4,5,6]//原数组 ,删除其中的2 let delArr = [3,2] arr
String 类型的使用 温习一下大家熟知的字符串用法,举个例子 let str = 'orange'; str.indexOf('o'); //0 str.indexOf('n'); //3 str.indexOf...('c'); //-1 这里 0 和 3 分别是 o 和 n 在字符串中出现的位置。...数组方法大家再熟悉不过了,却忽略了数组有 indexOf 这个方法(我个人感觉)。 干说不练瞎扯淡,遇到了什么问题,注意要点又在哪里?...arr.indexOf(‘orange')输出 0 因为 ‘orange' 是数组的第 0 个元素,匹配到并返回下标。...arr.indexOf(‘2016') 输出 1 因为此方法从头匹配直到匹配到时返回第一个数组元素的下表,而不是返回全部匹配的下标。
删除链表的倒数第N个节点 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2....当删除了倒数第二个节点后,链表变为 1->2->3->5. 说明: 给定的 n 保证是有效的。 进阶: 你能尝试使用一趟扫描实现吗?...---- 解法一 先遍历一遍计算链表长度;再遍历一遍删除倒数第n个节点 ? 解法二:进阶 只遍历一遍链表,能否解决这个问题?...class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { assert(n >=...Palindrome Linked List 请判断一个链表是否为回文链表。
1.递归方法实现 #define _CRT_SECURE_NO_WARNINGS #include #include int Fib(int n){ if(n...==1){ return 1;} if(n==2){ return 1;} return Fib(n-1)+Fib(n-2); } int main(){ int n; int a; printf...("请输入需要打印的斐波那契数\n"); scanf("%d",&n); a=Fib(n); system("pause"); return 0; } 2.非递归方法实现 #define _CRT_SECURE_NO_WARNINGS...#include #include int Fib(int n){ if(n==1){ return 1; } if(n==2){ return 1...printf("请输入需要打印的斐波那契数"); scanf("%d",&n); a=Fib(n); system("pause"); return 0; }
,find the nth num. 1 1 2 3 5 8... 2 #include 3 using namespace std; 4 5 int fib(int n)...{ 6 if(n==1 || n==2){ 7 return 1; 8 } 9 int prev=1; 10 int result=1; 11 n-=2; 12...while(n--){ 13 result+=prev; 14 prev=result-prev; 15 } 16 return result; 17 } 18 int main...(){ 19 int n; 20 while(cin>>n){ 21 cout<<fib(n)<<endl; 22 } 23 24 return 0; 25 }
题目: 思路: 由于这是一个链表,所以我们一般只能获取到一个头结点,然而其他信息我们不确定。所以可以采用双指针的方法。...思路二,利用一个指针先走出目标数目,然后两个指针一起走,那么先走的指针走完时,第二个指针恰好会停在目标元素上。...OutPutLinkedList(result); } /** * 方案2,用双指针,一个先走一定的步数,然后一起走,某一个先抵达就停止 * * @param...n; i++) { p2 = p2.next; } //当指针p2走完n步以后,让指针p2和p1同时向前走,直到p2走到最后一个节点,即p2->...next=NULL // 整个过程p2和p1之间相隔n-1个节点 while (p2 !
题意 给定一个链表,删除链表中倒数第n个节点,返回链表的头节点。 样例 给出链表 1->2->3->4->5->null 和 n = 2....删除倒数第二个节点之后,这个链表将变成 1->2->3->5->null. 思路 类似于 链表倒数第n个节点,先找到被删除节点的前节点,然后将前节点的 next 指向被删除节点的的 next 即可。...* @param n: An integer....preDelete.next = preDelete.next.next; return dummy.next; } } 原题地址 LintCode:删除链表中倒数第n...个节点
---- 起源 2020年是一个灾年。从上帝视角(精神与物质能量守恒定律)来看,当给关上一扇窗户的时候,那必然会打开新的一扇窗户。 那么当上帝给你关掉很多扇窗户的时候,你可以尝试砸开一堵墙 。...由于只有周末才有时间进行添砖加瓦,所以第一个目标是完成核心三大板块:会员、商品、订单。 ---- 小结 作为程序员,开源项目是必须要了解、参与进去的。(免费的东西,它不香吗?)
删除链表的倒数第 N 个结点 - 力扣(LeetCode) 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。...示例 1: 输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5] 示例 2: 输入:head = [1], n = 1 输出:[] 示例 3: 输入:head...int) -> ListNode: # 在最前添加一个节点,用于接 head dummy = ListNode(0, head) # 快指针: right...先让 right 快指针 走 n 步 for i in range(n): right = right.next # 2....= None: right = right.next left = left.next # 跳过中间的节点(即删除倒数第n个节点)
输入 =RANDBETWEEN(1,100) 然后下拉到A1:A10 好了 我们复制→粘贴为值 以防它再次随机改变 这是我们的案例数据 在实际的应用中 我们除了求最大最小的那个值 还经常要求第N...Large(数据范围,想要的第N个最大值) 在我们的例子中 如果要求第二个最大值 公式就应该写为 为了帮你们识别 我把第1个最大值81 和 第2个最大值76 标识出来了 可以预见 第一个最大值的结果和...继续作死一下 我们在第2个参数的位置输入其他值试试 0和负数都会报错 Small(数据范围,想要的第N个最小值) 其实说了Large函数之后 这个完全就是一样的啊 因为 第一个最大值就是最后一个最小值...最后一个最大值就是第一个最小值 第n个最小值就是倒数第n个最大值 第n个最大值就是倒数第n个最小值 这是一组绕口令 期末要考!...()()()() 扩展一下 这两个函数加上数组将会是非常好用的函数 例如 求前3个最大值的和 非常简短 而正确 以上 Q: 在上图的案例中,假设我输入 =SUM(Small(A1:A11
给定一个链表,要求移除导数第n个元素,并且返回新链表的head 样例: Given linked list: 1- >2->3->4->5, and _n_ = 2....但是上手去做的话会有一点小问题,因为如果是数组很好办,我们直接可以求到数组的长度,导数第N个元素也非常容易确定。...我们对这个链表遍历两次,第一次求到链表的长度,这样我们就可以推算到倒数第N个数是正数第几个数了。第二次我们移动对应的长度,找到需要删除的节点,将它移除即可。...我们可以先让一个运动员先跑30米,然后再派另外一个运动员从起点出发。这样,当第一个运动员跑到终点的时候,第二个运动员所在的位置就是距离终点30米的位置。...int) -> ListNode: pnt1 = head # 第一个指针先跑n步 for i in range(n):
领取专属 10元无门槛券
手把手带您无忧上云