
算法和数据结构
知识总结和刷题笔记
philwu000
这个作者很懒,什么都没留下…
展开
-
两个栈实现队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路stack1负责入队列,stack2负责出队列,当stack2为空时,将stack1中元素弹出压入stack2中。Java实现import java.util.Stack;public class Solution { Stack<Integer> stack1 = new Stack<Integer>(); Stack<Integer> stac原创 2021-01-23 12:37:27 · 167 阅读 · 0 评论 -
判断链表中是否有环
题意描述判断给定的链表中是否有环。如果有环则返回true,否则返回false。你能给出空间复杂度O(1)O(1)O(1)的解法么?思路快慢指针。fast每次走两步,slow每次走一步,如果有环,那么fast肯定能和slow相遇。注意循环时,要判断fast!=nullfast!=nullfast!=null和fast.next!=nullfast.next!=nullfast.next!=null,否则,当链表长度为1,为2时, fast指针会出现异常。Java实现/** * Definitio原创 2021-01-22 15:50:37 · 198 阅读 · 0 评论 -
反转链表
题目描述输入一个链表,反转链表后,输出新链表的表头。例如:输入:{1,2,3}返回:{3,2,1}思路双指针,用pre指针记录当前结点的前一个结点地址,用next记录当前结点的下一个结点地址,遍历链表,每次都令当前结点指向pre,并记录链表,防止断链,当前结点指向null时,返回pre即为新链表的表头。Java实现/*public class ListNode { int val; ListNode next = null; ListNode(int val原创 2021-01-22 15:25:23 · 162 阅读 · 0 评论 -
最大公约数
题目描述求出两个数的最大公约数,如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数。几个自然数公有的约数,叫做这几个自然数的公约数。公约数中最大的一个公约数,称为这几个自然数的最大公约数。思路用辗转相除法(欧几里得)算法,gcd(a,b)=gcd(b,r),其中r=a%b。Java实现import java.util.*;public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可原创 2021-01-22 11:52:40 · 491 阅读 · 0 评论 -
判断回文串
题目描述给定一个字符串,请编写一个函数判断该字符串是否回文。如果回文请返回true,否则返回false。思路头尾指针遍历判断即可。Java实现import java.util.*;public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * @param str string字符串 待判断的字符串 * @return bool布尔型 */ publ原创 2021-01-22 01:12:46 · 450 阅读 · 0 评论 -
旋转数组
题目描述一个数组A中存有N(N>0N\gt0N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0 A1 ……AN-1 )变换为(AN-M …… AN-1 A0 A1 ……AN-M-1 )(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?思路借助离散数学中的思路:(A逆B逆)的逆=BA,所以:反转前m-n-1位反转后m位反转整个数组得到结果注意有可能出现m>n的原创 2021-01-22 00:44:54 · 138 阅读 · 0 评论 -
寻找峰值
题目描述山峰元素是指其值大于或等于左右相邻值的元素。给定一个输入数组nums,任意两个相邻元素值不相等,数组可能包含多个山峰。找到索引最大的那个山峰元素并返回其索引。假设 nums[-1] = nums[n] = 负无穷。思路从数组尾端往前遍历,如果a[i]>a[i-1],那么a[i]即为山峰,因为前一轮遍历已经说明了a[i]>a[i+1]。Java实现import java.util.*;public class Solution { /** * 寻找最后的原创 2021-01-22 00:02:44 · 142 阅读 · 0 评论 -
递归、迭代(动态规划)解决斐波那契数列
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)n≤39n\leq39n≤39。解决思路递归,f(n)=f(n−1)+f(n−2)f(n)=f(n-1)+f(n-2)f(n)=f(n−1)+f(n−2),自上而下求解并回溯到根节点,是一颗完全二叉树,所以时间复杂度O(2n2^n2n);空间复杂度为递归栈的大小,所以是O(n)。迭代(动态规划):自下而上求解,记录下中间值,dp[0]=0,dp[1]=1,dp[2]=dp[1]+原创 2021-01-21 23:24:35 · 248 阅读 · 0 评论 -
反转字符串
题目描述写出一个程序,接受一个字符串,然后输出该字符串反转后的字符串。(字符串长度不超过1000)。解题思路借助StringBuffer(线程安全)/ StringBuilder(线程不安全)的reverse方法,因为是单线程,所以用StringBuilder就可以。借助字符数组来交换或者直接赋值,先用toCharArray,最后使用toString转回字符串。Java实现解法一(使用StringBuilder):import java.util.*;public class Sol原创 2021-01-21 18:43:36 · 229 阅读 · 1 评论 -
螺旋数组
题目描述给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序(顺时针)返回矩阵中的所有元素。举例:输入[[1,2,3],[4,5,6],[7,8,9]]输出[1,2,3,6,9,8,7,4,5]解题思路数组模拟。顺时针打印,首先定义上下左右四个边界,每次遍历完一轮四个边界都要相应加1减1,每一轮遍历条件是上边界不超过下边界,左边界不超过右边界。要避免重复打印,在下、左遍历前要判断左右边界、上下边界。Java实现import java.util.*;public class So原创 2021-01-21 16:37:54 · 326 阅读 · 2 评论 -
合并两个有序数组
题目描述给出两个有序的整数数组A和 B,请将数组B合并到数组A中,变成一个有序的数组。例:A={1,3}, B={2,4},合并后A={1,2,3,4}。注意:可以假设A数组有足够的空间存放B数组的元素,A和B中初始的元素数目分别为m和n。思路双指针遍历,从A和B的末尾开始遍历(也可以从头遍历,但是每次插入B中元素到A,需要移动元素位置),并设置合并后的数组下标m+n-1,谁大就把谁插入到合并后的A数组。如果B先遍历结束,说明合并结束;如果A先遍历结束,说明A中元素都比B大,直接把剩下B中元素复制原创 2021-01-20 21:03:00 · 446 阅读 · 0 评论 -
两数之和
题目描述给出一个整数数组,请在数组中找出两个加起来等于目标值的数,你给出的函数twoSum 需要返回这两个数字的下标(index1,index2),需要满足 index1 小于index2.。注意:下标是从1开始的,假设给出的数组中只存在唯一解。例如:给出的数组为 {20, 70, 110, 150},目标值为90输出 index1=1, index2=2思路解法一:暴力搜索,两层循环,对于每一个number,遍历整个数组,判断数组中是否存在numbers[i] + numbers[j] =原创 2021-01-20 15:12:37 · 133 阅读 · 0 评论 -
pat-B1020-月饼
题目链接->link思路贪心的思路,只要选单价最高的月饼最多,那么总利润也是最高。对月饼按照单价从小到大排序,如果月饼库存小于需求,那么库存全选上,需求减少相应数量;直到库存大于需求,那么最多选择当前剩余需求乘上单价。坑点:如果库存和总价用int表示,然后计算单价时强制转为double,那么实际数会出错,因为double精度高于int。代码#include <cstdi...原创 2020-03-01 11:48:07 · 227 阅读 · 0 评论 -
pat-A1048-Find Coins
题目链接->link题意描述给定n个面值的硬币和总数m,求两硬币之和等于m,其中v1<=v2,如果有多种解,那么输出v1最小的情况。思路此题可以用散列或者two pointers来做。首先容易想到的做法是,现将硬币值从小到大排序,然后:for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ if(c...原创 2020-02-19 14:49:30 · 168 阅读 · 0 评论 -
pat-B1005-继续(3n+1)猜想
题目链接->link思路求关键字,故对每个数字进行(3n+1)猜想操作后,设置hashmap[n]=true,即被覆盖的数。对关键字序列从大到小排序输出,同时最后一个关键字后不能有空格,所以用count记录关键字个数做判断。由于(3n+1)猜想操作后数可能很大,所以hashmap[n]设置为100完全不够,会发生数组越界,即段错误,所以将其设为10000。代码#include...原创 2020-02-18 20:58:01 · 203 阅读 · 0 评论 -
pat-A1050-String Subtraction
题目链接->link题意描述输入两字符串s1,s2,输出s1-s2,即s2所有字符在s1不能出现。思路输入s2,遍历s2并记录bool型hashmap[]值为false;然后遍历s1,如果hashmap[s1[i]]的值为false则跳过。代码#include <stdio.h>#include <math.h>#include <strin...原创 2020-02-18 18:37:23 · 168 阅读 · 0 评论 -
pat-A1041-Be Unique
题目链接->link题意描述输入n个数字,数字范围1~104,要求输出第一个不重复出现的数字。思路int hashmap[10001]存储所有数字出现的次数,因为要输出第一个不重复出现的,所以用id[]作为hashmap[]的下标,遍历hashmap[id[i]],出现第一个值为1的就输出。代码#include <stdio.h>#include <mat...原创 2020-02-18 18:08:48 · 183 阅读 · 0 评论 -
pat-B1047-编程团体赛
题目链接->link思路输入每行成绩,用int hashmap[]存储各队总成绩;用max记录冠军队下标输出即可。代码#include <stdio.h>#include <math.h>#include <string.h>#include <iostream>using namespace std;const int...原创 2020-02-18 17:04:41 · 210 阅读 · 0 评论 -
pat-B1043-输出PATest
题目链接->link思路遍历str,避免多个if判断,设置字典dict[6]存储P,A,T,e,s,t,用int型hashmap[6]存储对于字符的数目,用sum存储总数。进行sum次遍历hashmap输出对于字典的字母即可。代码#include <stdio.h>#include <math.h>#include <string.h>...原创 2020-02-18 16:37:28 · 194 阅读 · 0 评论 -
pat-B1042-字符统计
题目链接->link思路因为输入不区分大小写,输出又要求输出小写,那么把大写转小写,统计所有a~z出现次数;然后遍历hashmap[]得到出现最多的字母,注意只判断小写字母。代码#include <stdio.h>#include <math.h>#include <string.h>#include <iostream>...原创 2020-02-18 15:33:54 · 192 阅读 · 0 评论 -
pat-B1039/A1092-到底买不买
题目链接->link思路因为要求多余的珠子数或者缺少的珠子数,所以设int型hashmap[128]存储各种颜色的珠子数,输入时就可累计每种珠子数。可以设缺少的珠子数used=0,当hashmap[i]不为0时,就减少1个;否则,说明缺少该颜色珠子,used+1;最后判断used的值即知道时缺少还是多余的情况,多余的珠子为len1-len2,由题意知多余时str1长度总是大于str2...原创 2020-02-18 14:59:39 · 135 阅读 · 0 评论 -
pat-B1038-统计同成绩学生
题目链接->link思路因为分数范围0~100,故用int型hashmap[101]存储每一个分数出现的次数即可。对于想要查询的分数,不用数组全部输入再判断;而是每输入一个分数就输出一个次数。代码#include <stdio.h>#include <math.h>#include <string.h>#include <iost...原创 2020-02-18 12:59:49 · 166 阅读 · 0 评论 -
pat-B1033-旧键盘打字
题目链接->link思路思路和B1029类似,但是有几个坑。首先用hashmap数组存储不能输出的字符,设为false,初始化用memset(),初值为true,不能像B1029初始化为bool hashmap[]=false。注意坏掉的字符统一用大写输入,那么要将其转换为小写,将小写的hashmap[]设为false。当要输出大写字母时,仅当’+'号和其小写字母对于hashma...原创 2020-02-17 23:44:58 · 161 阅读 · 0 评论 -
pat-B1029/A1084-旧键盘
题目链接->link思路题目要求,输出str1在str2中未出现的字符,且对于大小写字母均输出大写形式,只输出一次。所以可以遍历str1和str2,用str1的每个字符挨个比较str2的所以字符,首先把两个串的小写字母全改成大写,然后判断两字符是否相等,相等则跳过,用str1的下一个字符继续比较。若比较到str2的最后一个字符,仍不相等,则说明要输出该str1的字符,因为ASCII...原创 2020-02-17 19:23:58 · 141 阅读 · 0 评论 -
pat-A1012-The Best Rank
题目链接->link题意描述输入n个学生的id,C,M,E三门课程的成绩和m个想要查询的学生id,如果查询的id不存在,输出N/A;否则,根据C,M,E以及平均分A排位,在4个排位中,输出该学生排位最高的值以及对应课程,如果学生有课程排名一样,则按照A>C>M>E的优先级。思路学生4项成绩用int型score[4]存储,各代表A,C,M,E的成绩,设置flag变量...原创 2020-02-16 17:58:54 · 202 阅读 · 0 评论 -
pat-B1015/A1062-德才论
题目链接->link题意描述输入学生序号,德分,才分,及格线和优秀线根据规则排序。规则如下:德分、才分均不低于及格线才允许进入排序范围。第一类学生:德分和才分均不低于优秀线。第二类学生:德分和才分有一门低于优秀线,但是德分不低于才分。第三类学生:德分和才分都低于优秀线,但是德分不低于才分。第四类学生:德分和才分都低于优秀线,且德分低于才分。第五类学生:德分或才分有一门低于及...原创 2020-02-15 23:07:44 · 181 阅读 · 0 评论 -
pat-B1014/A1061-Dating
题目链接->link题意描述给出四个字符串,前两个字符串对应位比较:第一个相等的大写字符代表日期,第二个相等的字符或数字代表小时;后两个字符比较第一个相等的字符代表分钟。思路判断小时是从判断日期后的下一个位置开始的。代码#include <stdio.h>#include <math.h>#include <string.h>#inc...原创 2020-02-14 17:03:33 · 272 阅读 · 1 评论 -
pat-B1009-说反话
题目链接->link思路二维数组存储然后逆序输出。代码#include <stdio.h>#include <math.h>#include <string.h>#include <iostream>using namespace std;int main(){ char str[85][85]; in...原创 2020-02-14 15:16:56 · 234 阅读 · 0 评论 -
pat-B1002-写出这个数
题目链接->link思路将各位求和后的结果存入整形数组con[]中,然后根据con[]的值输出对应的拼音。代码#include <stdio.h>#include <math.h>#include <string.h>#include <iostream>using namespace std;char str[10]...原创 2020-02-14 13:58:46 · 204 阅读 · 0 评论 -
pat-B1031-查验身份证
题目链接->link思路设置变量判断前17是否有非数字以及校验码是否正确,错误序列只输出一次。#include <stdio.h>#include <math.h>#include <string.h>#include <iostream>using namespace std;int weights[17]={7,9,...原创 2020-02-14 12:23:56 · 265 阅读 · 0 评论 -
pat-B1021-个位数统计
题目链接->link思路字符串数组存储整数,用整形数组存储0-9位累计的数目。字符ascii码0-9转换位数字需要x-‘0’,同理大写字符转小写:A-‘A’+'a’或者直接A+‘32’。代码#include <stdio.h>#include <math.h>#include <string.h>#include <iostream...原创 2020-02-14 11:34:00 · 133 阅读 · 0 评论 -
pat-B1006-换个格式输出整数
题目链接->link思路记录百、十、个位数目输出即可,个位从1开始输出。代码#include <stdio.h>#include <math.h>#include <string.h>#include <iostream>using namespace std;int main(){ int n; sc...原创 2020-02-13 22:37:26 · 114 阅读 · 0 评论 -
pat-A1058-A+B in Hogwarts
题目链接->link题意描述和pat-B1037类似,只是改成了求A+B的和。思路做法一:转换为同一单位求和,再将和转化回去,但要注意求和过程会溢出,所以用long long int。做法二:按次序求0位,1位,2位的和,0位和1位需要加上进位,分别用a[3],b[3]和carry存储,不会溢出。代码#include <stdio.h>#include <...原创 2020-02-13 22:04:41 · 153 阅读 · 0 评论 -
pat-A1027-Colors in Mars
题目链接->link题意描述输入三个10进制数,转换为三个13进制数输出。思路因为题意要求a<=168,又132=169,所以10进制转13进制:a= x×13x\times13x×131+y×13y\times13y×130,所以x=a/13,y=a%13,求得x,y输出。代码#include <stdio.h>#include <math.h&g...原创 2020-02-13 21:18:15 · 216 阅读 · 0 评论 -
pat-A1019-General Palindromic Number
题目链接->原创 2020-02-13 18:27:34 · 156 阅读 · 0 评论 -
pat-B1037-在霍格沃茨找零钱
题目链接->link思路根据1:17:29的比例,把应付、实际付价格转换为k1,k2,然后求差后,再换算为应输出格式。代码#include <stdio.h>#include <math.h>#include <string.h>#include <iostream>using namespace std;int ma...原创 2020-02-13 16:58:32 · 178 阅读 · 0 评论 -
pat-B1022-D进制的A+B
题目链接->link思路10进制转换低进制用除数取余法,因为a+b不超过31位,所以用数组存储转换后的结果,再从高位输出到低位。注意a+b=0时特判输出0。代码#include <stdio.h>#include <math.h>#include <string.h>#include <iostream>using na...原创 2020-02-13 15:37:58 · 117 阅读 · 0 评论 -
pat-B1036-跟奥巴马一起编程
题目链接->link思路行数为列数的一半,当列数为偶数时,row=col/2;当列数为奇数时,row=col/2+1。第一行和最后一行都是n个字符,第二行到第row-1行都是首位各一个字符,中间为col-2个空格。代码#include <stdio.h>#include <math.h>#include <string.h>#inclu...原创 2020-01-21 17:44:05 · 249 阅读 · 0 评论 -
pat-A1036-Boys vs Girls
题目链接->link题目描述给出n个学生姓名,性别,id,成绩,输出有三行,分别要求输出成绩最高的女学生信息、成绩最低的男学生信息以及两者成绩差的绝对值,如果输入的学生中无男或无女则再对应行输出Absent,最后一行输出NA。思路依照题意做即可,统计男、女学生数目做判断,保存、更新成绩最大、最小值以及对应学生结构体数组下标。代码#include <stdio.h>...原创 2020-01-21 12:24:00 · 207 阅读 · 0 评论 -
pat-A1006-Sign In and Sign Out
题目链接->link题意描述给出n个人进出实验室的时间,最早进的人开门,最晚出的人锁门,找出最早进和最晚出的人,规定没有同时进和同时出的人。思路做法和B1028-人口普查一样:https://blog.youkuaiyun.com/MichealWu98/article/details/104054881。因为输入不存在相同的进、出时间,故对每次输入只要判断是否大于当前最晚出的时间和是否小于...原创 2020-01-21 10:57:09 · 183 阅读 · 0 评论