
数据结构与算法
文章平均质量分 64
数据结构与算法
chenkaibsw
加油
展开
-
【无标题】剑指offer——寻找峰值
无原创 2022-06-25 14:25:47 · 246 阅读 · 0 评论 -
2019年华为春招实习笔试题
1.字符串重排题目描述 给你一个原始字符串,根据该字符串内每个字符出现的次数,按照ASCII码递增顺序重新调整输出。【温馨提示】 (1).原始字符串中仅可能出现“数字”和“字母”; (2).请注意区分字母大小写。 输入描述: eeefgghhh 输出描述: efghegheh 示例1 输入 eeefgghhh 输出 efghegheh分析:简要步骤分析: 1.从字符串头开始...原创 2018-04-16 16:33:44 · 5987 阅读 · 0 评论 -
2019年58同城笔试题
题目1.输入一个字符串,输入整数n,找出长度为n的相同字符构成的子串。例如:输入:字符串“abbbccccddeeffffaaaddzzz”,整数3输出:(1,3,bbb)(16,18,aaa)(21,23,zzz)基本思路:该题使用两个指针,i指向下标为0处,j指向下标为1处,如果i 指向的字符与j指向的字符相同,那么将将j向后挪动一位,并将计数器加一,重复该操作直到i 和j 指向的字符不同为止...原创 2018-04-17 20:40:58 · 3623 阅读 · 0 评论 -
剑指offer数组练习
1.面试题第56题题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。1)最初的思路:将数组中的第一个数字与其他的数字进行对比,如果有与它相同的就将第二个数字与其他数字对比,依次下去。问题:会发现时间复杂度过高。真正写代码时会根据题目的特征加一些判断,来减小比较的次数,例如将添加一个计数器,在有两个出现一次数字时就停止遍历数组,但依然不是一个好的方法...原创 2018-03-07 21:49:25 · 212 阅读 · 0 评论 -
函数的递归
1.定义:递归函数是自己调用自己的函数,每次调用函数都会开辟新的内存空间,递归调用可以看成函数的嵌套调用 举例:如下图是一个递归调用的例子,main函数执行到recur()时,开始调用recur()函数,将这次调用称为recur1,recur1往下执行,于是在内存内开辟一份内存空间,从头往下执行,在recur1定义一个变量c,在键盘上输入abc回车时,c被赋值为a,因为a不等于原创 2017-10-23 18:57:02 · 1803 阅读 · 0 评论 -
堆排序2018年1月23号笔记
2018年1月23号笔记优先队列和堆排序都是下标从1开始的,如果从下标为0开始,需要作改动,具体看代码。1.优先队列:提出背景:处理有序元素,但并不一定要求他们全部有序,很多情况下,我们收集一些数据,处理当前最大的数据。优先队列支持的操作:1)删除最大元素 2)插入元素2.堆的定义:堆是具有下列性质的完全二叉树:每个结点的值都大于或者等于其左右孩子结点的值,称为大顶堆;或者每个结点的值...原创 2018-01-25 22:52:43 · 369 阅读 · 0 评论 -
快速排序的看书总结
1.大话数据结构中的基本排序第一种方式:如下图,low指向第一个元素,将high 指向最后一个元素,将low指向的元素赋值给pivotkey,从high开始,如果high指向的元素大于pivotkey,就将high向左移动,知道high指向的元素小于pivotkey,此时将low指向的元素和high指向的元素交换,然后将low指向的元素向右移动,并将low指向的元素与pivotkey比较,如果lo...原创 2018-01-25 09:58:44 · 332 阅读 · 0 评论 -
C语言中字符串的三种表示方法
1.在C语言中,是将字符串作为字符数组来处理的,字符串是逐个存放到数组元素中的,例如用一个一维的字符数组存放字符串"I am a boy.",如下代码:char c[11] = {'I','a','m','a','b','o','y','.'};这个字符串的实际长度与数组长度相等,实际工作中,人们关心的往往是字符串的有效长度而不是字符串的数组长度,常见的下面三种方式来测定字符串的实际长度:(1)在...原创 2018-01-03 09:42:16 · 66959 阅读 · 3 评论 -
剑指offer 从尾到头打印链表的每个节点的值
题目描述输入一个链表,从尾到头打印链表每个节点的值。分析:方法一:首先想到的是递归的方式,将链表遍历后存入栈中,然后从栈中取出。方法二:递归的本质就是一个栈结构,所以也可以使用递归来实现,要实现反过来输出链表,我们每访问一个节点的时候,先递归遍历它后面的节点,再输出该节点自身,这样输出的就是链表的反转的结果。方法一代码实现:public class Solution{ public Arr...原创 2018-06-18 17:25:03 · 312 阅读 · 0 评论 -
剑指offer 二分查找的递归和非递归方式
1.典型的二分查找的两种方式(注意二分查找的适用条件是递增的数组)1).递归方式class BinaryTree{ public static void main(String[] args) { int[] a = {1,3,4,6,8,9,10,11,23}; System.out.println(search(a,12,0,a.length-1)); } pu......原创 2018-06-10 15:01:28 · 680 阅读 · 2 评论 -
剑指offer 翻转字符串
1.题目描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?方法一:使用字符串函数s...原创 2018-06-13 11:10:26 · 795 阅读 · 0 评论 -
队列的最大值
题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1},{2,[3,4,2],6,2,5,1}, {2,3,[4,...原创 2018-06-13 16:16:04 · 4478 阅读 · 0 评论 -
大数相加,大数相乘
描述以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。(字符串长度不大于100000,保证字符串仅由'0'~'9'这10种字符组成)输入:"1","99"复制返回值:"100"复制说明:1+99=100分析: 示例1:"1" 加上"89" ,操作步骤,将这两个字符串先反转,定义一个3位数组用来保存相加结果。 "98" + "1"= "09"示例2:"1"加上"99",操作步骤,将两个字符串先反转,定义一个3位数组用来保存相加...原创 2021-08-21 22:20:35 · 169 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路:遍历两次数组,第一次只取奇数,第二次只取偶数。import java.util.*;public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param array int整原创 2021-08-22 17:23:35 · 76 阅读 · 0 评论 -
关于堆的学习
1.堆的概念大顶堆:每个节点的值都大于或等于其左右孩子节点的值,下图是完全二叉树是大顶堆小顶堆:每个节点的值都小于或等于其左右孩子节点的值如果我们用指针来表示大顶堆,那么每个结点需要三个指针来找到它的上下结点(父结点和两个子结点各需要一个),但如果使用完全二叉树,表达就会边的特别方便,如下图所示。完全二叉树使用数组而不需要指针就可以表示大顶堆。(注意为了方便,是从下标1开始存放元素的)...原创 2018-06-20 10:01:55 · 294 阅读 · 0 评论 -
剑指 Offer 数值的整数次方
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方注意点:1)对特殊输入的处理,如果是一个数为0,0的负数次方不存在,同时考虑分为数的正数次方和数的负数次方的两种情况。2)通过递归方式求整数的n次方的时间复杂度是O(logn)3)使用为运算效率较高。例如数x/2可以使用x>>1代替,x%2可以使用x&1来代替。代...原创 2018-06-19 21:51:49 · 195 阅读 · 0 评论 -
剑指Offer中的回溯法题
1.面试题38 字符串的排列输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。代码实现:class JianZhiOffer { public static void main(String[] args) { JianZhiOffer p = new JianZhiO...原创 2018-06-15 19:54:06 · 364 阅读 · 0 评论 -
回溯法的总结
1.一维度问题1)排列问题(leetCode 46号问题)题目描述:输入数字1,2,3,输出它们的所有组合1 2 3 ,1 3 2, 2 1 3, 2 3 1,3 1 2, 3 2 1。代码实现:方法一:使用index来标记temp数组的长度,当长度为3的时候,就停止。每次for循环都是从0开始,但是已经取过的值使用flag标记。class HuiSu{ sta...原创 2019-10-21 19:56:49 · 280 阅读 · 0 评论 -
键值offer 用两个栈实现队列
描述用两个栈来实现一个队列,分别完成在队列尾部插入整数(push)和在队列头部删除整数(pop)的功能。 队列中的元素为int类型。保证操作合法,即保证pop操作时队列内已有元素。思路:栈是先进后出的数据结构,队列是先进先出的数据结构,通过第二个栈每次把新增的数据放入第一个栈的底部,可以实现先进先出的数据结构。代码实现:import java.util.Stack;public class Solution { Stack<Integer> stack1 = new原创 2021-08-19 21:52:37 · 110 阅读 · 0 评论 -
剑指offer 字符串出现次数的TopK问题(哈希相关的问题)
描述给定一个字符串数组,再给定整数k,请返回出现次数前k名的字符串和对应的次数。返回的答案应该按字符串出现频率由高到低排序。如果不同的字符串有相同出现频率,按字典序排序。对于两个字符串,大小关系取决于两个字符串从左到右第一个不同字符的 ASCII 值的大小关系。比如"ah1x"小于"ahb","231"<”32“字符仅包含数字和字母[要求]如果字符串数组长度为N,时间复杂度请达到O(NlogK)分析:现存入HashMap,此时时间复杂度为O(N),再将HashMap转为原创 2021-08-22 19:51:59 · 427 阅读 · 0 评论 -
第一次只出现一次的字符
题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).分析:用一个数组作存放每个字符出现的次数,数组大小就取52(26个大写字母加上26个小写字母)。这里其实也是哈希的思想,可以O(1)的时间复杂度取出各个字符出现的次数。代码实现:class Solution {...原创 2018-08-03 11:02:27 · 490 阅读 · 0 评论 -
剑指Offer——设计LRU结构
描述设计LRU(最近最少使用)缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能1. set(key, value):将记录(key, value)插入该结构2. get(key):返回key对应的value值提示:1.某个key的set或get操作一旦发生,认为这个key的记录成了最常使用的,然后都会刷新缓存。2.当缓存的大小超过K时,移除最不经常使用的记录。3.输入一个二维数组与K,二维数组每一维有2个或者3个数字,第1个数字为opt,第2,3个数字为key,v原创 2021-08-20 21:36:18 · 233 阅读 · 0 评论 -
13.剑指offer 二叉树刷题
1.对称二叉树:题目描述请实现一个函数,用来判断一棵二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。public class Solution { boolean isSymmetrical(TreeNode pRoot) { if(pRoot == null){ return true; } return isSymme(pRoot.left, pRoot.right);原创 2021-03-28 11:36:28 · 173 阅读 · 0 评论 -
二叉搜索树和双向链表
参考https://www.nowcoder.com/questionTerminal/947f6eb80d944a84850b0538bf0ec3a5题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。分析:题中要求输出排序的双向链表,因为在二叉搜索树的中序遍历是递增的,所以想到使用中序遍历,从小到大逐个找个节点,然后创建双向...原创 2018-06-17 21:58:17 · 247 阅读 · 0 评论 -
兔子繁殖问题采用递归和循环两种方式
兔子繁殖问题:题目描述有一只兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多少?输入描述:输入int型表示month输出描述:输出兔子总数int型基本思路:这是一个递归问题,从第一个月开始每个月兔子的数目为:1,1,2,3,5,8,13........,可以看出从第三个月开始,每个月兔子的数目是前两个月兔子的数目的和,用数学...原创 2018-03-11 19:42:25 · 10322 阅读 · 0 评论 -
动态规划问题小结
1.爬楼梯问题,到达楼梯的第i阶有多少中爬法关键:第i阶楼梯,只可能从楼梯第i-1阶与i-2阶到达,所以到达第i阶的爬法与第i-1阶、第i-2阶的爬法直接相关。这类问题分为四步:1)原问题与子问题:找到子问题2)第i个状态即为i阶台阶的所有走法数量3)确认边界状态的值,边界状态为1阶台阶有一种走法,2阶有两种走法,即dp[1]=1,d[2]=24)确定状态转移方程dp[n] = dp[i-1] +...原创 2018-06-20 22:24:31 · 282 阅读 · 0 评论 -
链表的倒数第k个节点
题目描述输入一个链表,输出该链表中倒数第k个结点分析:方法一:遍历两次链表,第一个统计出链表的节点的个数(例如n个),第二次就遍历到第n-k个节点,就是倒数第k个节点。这种方法要遍历两次链表。方法二:定义两个指针,第一个指针从链表头开始先走k-1步,然后两个指针同时向前走,当走的快的指针到达链表末尾时,慢的指针指向第k个节点。方法二的代码实现:public class Solution{ ...原创 2018-06-18 19:34:55 · 185 阅读 · 0 评论 -
剑指Offer数组中出现超过一半的数字+最小的k个数
一.快速排序首先介绍一下快速排序,因为这两题都可以使用快速排序的Partition函数来做。快速排序算法的关键是在数组中选择一个数字假设为pivot,然后将数组分为两部分,小于该数字的方法该数字前面,大于该数字的放到该数字的后面。这个函数的实现是通过设置两个指针i和j来操作,这也是数组操作常用的方法。该函数可用于得到数组中任意第k大的数字(下面的两题都使用该方法)。代码实现: public in...原创 2018-06-19 10:32:06 · 227 阅读 · 0 评论 -
二进制的1的个数
1.题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。方法一:首先想到的思路:public class Solution { public int NumberOf1(int n) { int x = 1; int count = 0; while(x!=0){ //这里能换成x>0...原创 2018-08-03 20:36:22 · 208 阅读 · 0 评论 -
情景题笔试记录
1.携程(9/5)思路:class Node{ int dingdan; int ruzhu; int lidian; }class TestJava{ public static void main(String[] args) { Scanner in = new Scanner(System.in); ArrayList<Integer> ...原创 2018-09-05 09:36:39 · 1069 阅读 · 0 评论 -
剑指Offer面试题25:二叉树中和为某一值的路径
https://www.jianshu.com/p/c661cbe1d421题目描述:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。import java.util.ArrayList;/**public class TreeNode { int val = 0; TreeNode l...原创 2018-06-18 10:11:32 · 248 阅读 · 0 评论 -
复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)分析:分为三步骤:1)复制每个节点,如复制A得到A1,并将A1插入到A的后面2)重新遍历链表,复制老节点的指针给新节点3)拆分链表,将链表拆分为原链表和复制后的链表代码实现:pu...原创 2018-06-17 08:47:59 · 136 阅读 · 0 评论 -
堆排序与优先队列
一.优先队列1.优先队列的提出背景:许多应用程序都需要处理有序的元素,但不一定要求他们全部有序,或者不一定要一次将它们排序,很多情况下我们会收集一些元素,处理当前键值的最大值,然后再收集更多的元素,再处理当前键值最大的元素。2.堆的定义:堆是具有下列性质的完全二叉树:每个结点的值都大于或者等于左右孩子结点的值,称为大顶堆;或者每个结点的值小于或者等于其左右孩子结点的值,称为小顶堆。3.大顶堆的表...原创 2018-03-21 08:43:24 · 436 阅读 · 0 评论 -
华为上机题字符串的处理
1.题目描述•连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组;•长度不是8整数倍的字符串请在后面补数字0,空字符串不处理示例1输入abc123456789输出abc000001234567890000000基本思路:将字符串个数对8整除,得到的余数如果为零,说明字符串刚好是8的整数(即刚好按长度为8拆分),如果不为零,可以通过补零,将剩下的不足8为的余数添加到8位。代码实...原创 2018-03-10 15:34:42 · 1626 阅读 · 0 评论 -
输入整数数组排序
题目描述输入整型数组和排序标识,对其元素按照升序或降序进行排序示例1输入81 2 4 9 3 55 64 250输出1 2 3 4 9 25 55 64分析:Java自带数组排序方法,Arrays.sort(),将数组排序后,分别从前往后输出和从后往前输出就分别对应着升序排列和降序排列。代码实现:import java.util.Scanner;import java.util.Arrays...原创 2018-03-09 22:14:53 · 3484 阅读 · 0 评论 -
进制的转换
1.十进制和十六进制的转换举例子:十六进制:0X10 对应的十进制:1*16^1+0*16^0Java实现:写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串。(多组同时输入)具体代码,第一版:import java.util.Scanner;public class Main{ public static void main(String...原创 2018-03-09 22:00:08 · 2750 阅读 · 0 评论 -
华为机试题总结
1.题目描述数据表记录包含表索引和数值,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。输入描述:先输入键值对的个数然后输入成对的index和value值,以空格隔开输出描述:输出合并后的键值对(多行)示例1输入40 10 21 23 4输出0 31 23 4思路:这边是键值对,想到map集合,在map集合中键是不能重复,值会自动覆盖,而...原创 2018-03-08 17:17:52 · 1252 阅读 · 0 评论 -
自定义HashMap
1.使用LinkedList实现HashMap LinkList是链表数组实现的,这里为了方便直接使用的基于LinkedList的双向链表数组2.自定义HashMap的功能函数1)添加元素public void put(Key key,Value value)2)根据键获取值public Value get(Key key)3)根据键删除键值对public Value remove(Key ...原创 2018-04-27 15:06:56 · 717 阅读 · 0 评论 -
自定义一个ArrayList类
1.自定义ArrayList类功能1)添加元素:public void add(Item obj);2)根据索引删除某个元素:public Item remove(int index)3)删除ArrayList中的某个元素:public boolean remove(Item item)4)根据索引获取某个元素:public Item get(int index)5)实现迭代器,可以遍历列表6)获...原创 2018-04-26 16:03:12 · 4054 阅读 · 0 评论 -
常用排序算法和查找算法的时间复杂度和空间复杂度
常用的排序算法的时间复杂度和空间复杂度 排序法 最差时间分析 平均时间复杂度 稳定度 空间复杂度 冒泡排序 O(n2) O(n2) 稳定 O(1) 插入排序 ...转载 2018-04-19 08:14:55 · 26731 阅读 · 6 评论