算法笔记练习题
解除
世界很精彩!
展开
-
证明:在任一含n个元素的堆中,至多有ceiling(n/(2^(h+1)))个高度为h的节点。
证明:当n = 1时,高度为h=0的结点的个数为1=ceiling(1/(2^(0+1)))。当n>=2时,任意给定一个n,用数学归纳法证明。1、base:当h=0时,即高度为0的结点就是叶子结点。根据《算法导论》习题6.1-7可知,叶子结点的数目为n-floor(n/2)=ceiling(n/2)=ceiling(n/(2^(0+1))),即满足上式。2、step:取k为满足0<=k<floor(log2N)的任意整数(注释:log2N是以2为底n的对数)。假设对于高度h=k的结原创 2021-12-06 22:07:22 · 1152 阅读 · 0 评论 -
单链表的划分
方法一:额外空间复杂度O(N),遍历链表,建立节点数组,利用荷兰旗问题中的方法划分数组,如何将数组中的节点成单链表。方法二:建立三个单链表,分别存储小于、等于大于X的节点。再将三个单链表串一起。法二也可分为两种:a、初始化六个节点为null。b、建立三个Node(0)。package class04P;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.StreamTokenizer;.原创 2021-10-22 22:18:36 · 204 阅读 · 0 评论 -
快慢指针寻找链表中点的不同情况分析
原创 2021-10-22 16:12:44 · 109 阅读 · 0 评论 -
三种方法判断链表是否为回文结构
方法一:全部丢到栈中,然后依次取出与链表中的值比较。需要N个额外空间。方法二:利用快慢指针,找出链表中点位置,将链表后半部分依次压栈,再取出与链表的值比较。需要额外N/2个额外空间。方法三:利用快慢指针,找出链表中点位置,将链表后半部分翻转,依次比较两链表值,判断是否是回文结构后将翻转的链表还原。package class04P;import java.util.Stack;public class Code04P_IsPalindromeList { public static原创 2021-10-21 22:58:17 · 1486 阅读 · 0 评论 -
java打印有序链表的公共部分(StreanTokenizer的简单用法)
但是最后面打印了空白符,不清楚为什么也通过测试!package class04P;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.StreamTokenizer;public class Code03P_StreamTokennier { public static StreamTokenizer st = new StreamTokenizer(new BufferedRea原创 2021-10-20 17:09:41 · 112 阅读 · 0 评论 -
回顾单链表、双向链表的翻转+打印链表公共部分
package class04P;public class Code02P_ReverseList { //下面是单链表的定义、翻转和打印 public static class Node{ public int val; public Node next; public Node(int val){ this.val = val; } } public static Node re原创 2021-10-20 10:42:30 · 88 阅读 · 0 评论 -
java实现计数排序与基数排序
基数排序的正确性证明可以用数学归纳法,《算法导论》第三版习题8.3-3。里面需要一个概念:排序算法的稳定性。//计数排序package class03P;import java.util.Arrays;public class Code01P_CountSort { // 计数排序例子,如按给定一个数组,数组中的元素是员工的年龄,范围是0~200,数据大小限制在一定的范围内的排序 // 计数排序的时间复杂度是O(N) public static void countSo.原创 2021-10-18 23:21:01 · 99 阅读 · 0 评论 -
java比较器的简单使用
package class03P;import java.util.Arrays;import java.util.Comparator;import java.util.PriorityQueue;public class Code03P_Comparator { public static class Student{ public String name; public int id; public int age; .原创 2021-10-16 21:56:58 · 94 阅读 · 0 评论 -
java实现堆排序及其扩展题目
package class02P;import java.util.Arrays;public class Code03P_HeapSort { public static void heapSort(int[] arr){ int size = arr.length - 1; for (int i = 0; i < arr.length; i++) { heapInsert(arr, i); }原创 2021-10-15 15:24:33 · 83 阅读 · 0 评论 -
java实现基于荷兰旗问题的快速排序
1、先写一个稍微简单点的代码。这个排序是主要想法是:给定一个数组arr[n],把数组中小于arr[n]的数放左边,并记下左边的位置下标i;大于等于arr[n] 的放右边(arr[n]是不进行交换的);再把arr[n]与位置下标为i + 1的数进行交换。最后递归左边的数组和右边的数组。package class02P;import java.util.Arrays;public class Code06P_QuickSort1 { public static void quickSort1(原创 2021-10-12 23:50:32 · 89 阅读 · 0 评论 -
荷兰旗问题
问题一的代码:package class02P;import java.util.Arrays;public class Code05P_SimpleNetherlandsFlag { public static void SimpleNetherlandsFlag(int[] arr, int num){ int flag = -1; int i = 0; int tep; while(i < arr.length).原创 2021-10-12 11:01:47 · 87 阅读 · 0 评论 -
归并排序求解逆序对
打印所有的逆序对,并求出逆序对的总数。package class02P;import java.util.Arrays;public class Code02P_ReversePair { public static int ReversePair(int[] arr){ if(arr == null && arr.length < 2) return 0; return MergeSort(arr, 0, arr.length -原创 2021-10-11 23:43:59 · 98 阅读 · 0 评论 -
归并排序解最小和问题(Java)
给定一个n个元素的数组arr,arr[i]的最小和是指下标0到i-1上的小于arr[i]的所有元素之和。数组arr的最小和是指数组中每个元素的最小和的总和。参考:左程云)最新数据结构与算法基础到高级算法教程全家桶下面代码求的是数组的最小和:public class Code01P_MergeSort { public static void mergeSort(int[] arr){ if(arr == null || arr.length < 2){原创 2021-10-11 14:43:06 · 153 阅读 · 0 评论 -
1009 说反话 两种解法 gets()函数的替换
解法一:#include<cstdio>#include<cstring>int main(){ char str[90]; fgets(str,89,stdin);//PAT中没有gets函数 char ans[90][90]; int L=strlen(str)-1;//fgets函数会把换行符也读进来,要减一 int r=0,h=0; for(int i=0;i<L;i++) { if(str[i]!=' ') { ans[r][h]=原创 2021-02-27 18:51:57 · 221 阅读 · 0 评论 -
codeup 5901 回文串
#include<cstdio>#include<cstring>int main(){ char str[256]; while(gets(str)!=NULL) { int L=strlen(str), i; for(i=0;i<L/2;i++)//a/2表示向下取整,要对比a/2个数。而数组是从0开始的,故str[a/2]不用读取。 { if(str[i]!=str[L-1-i]) { printf("NO\n");原创 2021-02-27 14:54:55 · 60 阅读 · 0 评论 -
1022 D进制的A+B (20 分)
输入两个非负 10 进制整数 A 和 B (≤230 −1),输出 A+B 的 D (1<D≤10)进制数。输入格式:输入在一行中依次给出 3 个整数 A、B 和 D。输出格式:输出 A+B 的 D 进制数.#include<cstdio>int main(){ int A,B,D; scanf("%d%d%d",&A,&B,&D); int sum,ans=0,t=1; sum=A+B; while(原创 2021-02-26 22:54:32 · 107 阅读 · 1 评论 -
codeup 1928 日期处理 两种解法
第一种是《算法笔记》中的解法。第二种解法的速度比第一种快点,但写法相对复杂点。两种解法都AC了。//第一种解法 #include <cstdio>int month[13][2]={{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};bool isLeap(int year){ return (year%4==0)&&原创 2021-02-26 01:06:03 · 122 阅读 · 1 评论 -
1036 跟奥巴马一起编程 (15 分)
#include <cstdio>int main(){ int row, col; char c; scanf("%d %c",&col,&c); if(col%2==1) row=(col+1)/2; else row=col/2; for(int i=0;i<col;i++) { printf("%c",c); } printf("\n"); for(int i=0;i<row-2;i++) { printf("%c",原创 2021-02-25 19:42:24 · 50 阅读 · 0 评论 -
问题 B: 找x
#include <cstdio>const int maxn = 210;int a[maxn];int main(){ int n, x, i; while(scanf("%d",&n)!=EOF){ for(i = 0;i<n;i++){ scanf("%d",&a[i]); } scanf("%d",&x); for(i=0;i<n;i++){ if(a[i]==x){ printf("%d\n",i);原创 2021-02-24 23:22:56 · 51 阅读 · 0 评论 -
3.1 简单模拟 1032 挖掘机技术哪家强 (20分)
#include <cstdio>#define MAX 100001int main(){ int N, SchId, Score, Sch[MAX]={0}; scanf("%d",&N); for(int i=0;i<N;i++){ scanf("%d%d",&SchId,&Score); Sch[SchId]=Sch[SchId]+Score; } int MaxSco=0,MaxId=0; for(int i=0;i<MAX;原创 2021-01-30 20:36:45 · 61 阅读 · 0 评论 -
3.1 简单模拟 1001 害死人不偿命的(3n+1)猜想 (15分)
1001 害死人不偿命的(3n+1)猜想 (15分)#include<stdio.h>int main(){ int n,i=0; scanf("%d",&n); while(n!=1) { if(n%2==0) { n=n/2; i++; } else { n=(3*n+1)/2; i++; } } printf("%d",i); return 0; } #include <cstdio>原创 2021-01-30 20:32:45 · 67 阅读 · 0 评论