练习题
人山人海肉最可爱
目前菜鸟一枚,希望大佬们多多指教,渴望有一天可以和大佬们肩并肩。
展开
-
写一个不能被继承的类
虚继承方法templateclass Q{ friend T; private: Q() {} ~Q() {}};class A : virtual public Q{ p原创 2017-09-07 20:57:48 · 224 阅读 · 0 评论 -
插入排序-----直接插入排序
基本思想:每一步将一个待排序的元素,按其排序码的大小,插入到前面已经排好序的一组元素的合适位置上去,直到元素全部插完为止。具体代码实现:void InsretSort(int arr[], int size){ int i = 1; for (i = 1; i < size; i++) { int key = arr[i]; int end = i - 1; //找...原创 2018-09-25 21:22:19 · 233 阅读 · 0 评论 -
插入排序----希尔排序
希尔排序又称缩小增量排序,是对直接插入排序的优化分析:void ShellSort(int arr[], int size){ int i = 0; int gap = 3; while (gap > 0) { for (i = gap; i < size; i++) { int key = arr[i]; int end = i - gap; ...原创 2018-09-25 21:41:43 · 132 阅读 · 0 评论 -
直接选择排序
基本思想:每一趟(第i趟,i = 0,1,…,n - 2)在后面n - i个待排序的数据元素集合中选出关键码最小的数据元素,作为有序元素序列的第i个元素。待到第n - 2趟做完,待排序元素集合中只剩下1个元素,排序结束【直接选择排序】在元素集合array[i]-array[n-1]中选择关键码最大(小)的数据元素若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第...原创 2018-09-26 09:10:50 · 151 阅读 · 0 评论 -
冒泡排序
冒泡排序是一个很经典的排序,它的基本思想也很简单,就是在每一趟的排序中,每次都是从第一个元素开始,让它与它后边的元素比较,如果比它后边的元素大,则交换,如果不是,则继续向后走,重复上边的比较步骤,每一趟只是把最大的那个数排到了最后位置,所有总共要进行n趟排序,每一趟要排序的个数要减去已经排好的个数。void BubbleSort(int arr[], int size){ int i = ...原创 2018-09-26 18:11:19 · 127 阅读 · 0 评论 -
方法重载与方法重写的区别
a. 概念上:b. 范围上:c. 权限要求:原创 2018-10-17 21:27:53 · 838 阅读 · 0 评论 -
在JAVA中如何将字符串首字母转成大写
分析:在JAVA中String类没有提供将首字母大写的操作,那这就需要我们自己来实现了。但String类有提供将字符串转大写和字符串截取的操作,我们可以结合提供的这两个操作来实现字符串首字母大写。步骤:先将字符串的第一个字符截取出来,截取出来后是一个字符串将截取出来的字符串转大写将这个字符串中除了第一个字符外的其他字符截取出来将第2步的结果和第3步的结果拼接起来具体代码实现:pu...原创 2018-10-27 18:39:52 · 26519 阅读 · 0 评论 -
ArrayList与Vector的区别
产生版本:Vector是JDK1.0产生的,ArrayList是JDK1.2产生的线程安全:Vector采用在方法上添加synchronized来保证线程安全,性能较低;ArrayList采用异步处理,性能较高,不安全。初始化以及扩容策略:Vector对象产生时就初始化数组大小为10,当数组不管用时,扩容为源数组2倍;ArrayList使用懒加载策略,在第一次添加元素时才初始化数组...原创 2018-12-09 09:52:28 · 144 阅读 · 0 评论 -
写两个线程,一个线程打印1~52,另一个线程打印A~Z,打印顺序是12A34B....5152Z
分析:其中一个线程负责打印数字,另一个线程负责打印字母,但有一个特点就是数字刚好是字母的2倍(字母26,数字52),数字一次打印2个,字母打印一个,并且字母打印线程一定是在数字打印线程之后才打印的。如何控制字母打印线程一定是在数字打印线程之后,并且数字和字母还是交替出现的?我们可以考虑用信号量来控制,假若说:当信号量为1的时候告诉打印数组线程执行,当数字是2的时候,让打印字母的线程执行,然后...原创 2019-01-12 18:46:46 · 8268 阅读 · 0 评论 -
启动3个线程,3个线程的名字分别是A,B,C,每个线程将自己的名称在屏幕上打印5遍,打印顺序的ABCABC.....
分析:这个题的思路和我的上一篇博客https://blog.csdn.net/huaijiu123/article/details/86370451这个题的思路是相同的,都是利用信号量来解决。不同的是:要将notify()换成notifyAll(),这是为什么呢?万一A打印完之后,你只唤醒了C而没唤醒B,这就会产生死锁,所以要唤醒所有线程。3个线程同时启动后,如果是C先进,这时flag...原创 2019-01-12 19:23:18 · 1263 阅读 · 0 评论 -
模拟实现一个简单的字典
分析:实现一个简单的英汉字典 这个问题其实和我的上一篇博客《判断一个单词拼写是否正确》类似,都可以用二叉搜索树来解决,只不过这次结点里存放的数据,是以键值对的形式存放的,意思就是这个结点的数据由两种类型的数据组成,一个是英语,一个是英语对应的汉语意思。 具体的插入、删除、查找操作为什么那样实现,请参考这篇博客:...原创 2018-09-15 15:19:45 · 969 阅读 · 0 评论 -
判断一个单词拼写是否正确
分析: 我们可以用二叉搜索树来解决这个问题,把单词存在一个结点里,这个结点还能保存它的左右孩子指针,左子树里存的是比它小的单词,右子树里存的是比它大的单词。二叉搜索树的概念和基本操作在我的上一篇博客中已经解释清楚了,这是上一篇博客连接:...原创 2018-09-15 15:00:38 · 2338 阅读 · 0 评论 -
判断大小端
题目:请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序。简答: 大端字节序:是指数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中; 小端字节序:是指数据的地位保存在内存的低地址中,而数据的高位保存在内存的高地址中。问题分析:我们要判断当前机器是大端存储还是小端存储,我们只需要给出一个数字,然后取出它的一个字节,然后根据这一个字节的数据来判断它是大...原创 2018-07-07 21:41:18 · 148 阅读 · 0 评论 -
用栈解决----括号匹配问题(MatchBrackets)
问题:给出一个字符数组,判断里边的括号是否匹配。 分析:首先我们要确定用什么方法来解决这个问题,然后再进一步分析过程。 我们可以用栈来解决这个问题,如果是左括号我们就让它入栈,如果是右括号,我们先要判断它和栈顶元素(左括号)是否匹配,如果匹配,我们就让左括号出栈,依次进行,直到栈空时结束,当然如果在前边如果出现匹配不正确,我们直接返回,不用再向后进行了。 栈的特点:后进先出 好了,这个...原创 2018-08-18 10:54:57 · 16590 阅读 · 3 评论 -
复杂链表的复制
首先我们要搞清楚一个问题,什么是复杂链表呢? 或许有的人并没有听过这个词,这个并不奇怪,对于像我这种小菜鸟来说,可能还有好多没听过的知识点呢!复杂链表的复制我也是昨天花了一天的时间才搞明白(嘿嘿,可能是因为我有点笨吧!)。在复杂链表中,除了有一个next指针指向下一个结点,还有一个random指针指向任意结点或NULL。eg: 对复杂链表进行复制时,必须对其random域进行复制,...原创 2018-08-16 11:29:27 · 165 阅读 · 0 评论 -
逆波兰表达式(后缀表达式)
栈有什么用呢?我们可以用栈解决很多难以解决的问题。例如:括号匹配问题、逆波兰表达式(也叫后缀表达式)、迷宫等问题,这些问题我们都可以用栈来解决。 今天我们就来看看用栈如何解决逆波兰表达式问题。什么是逆波兰表达式呢?我们表述一个算式通常是这样:X + Y,即:“操作数1 操作符 操作数2”,当然也有比较特别的,比如“sqrt(N)”,sqrt是操作符,N是操作数,而逆波兰表达式则很统一,先操作...原创 2018-08-23 17:45:15 · 13414 阅读 · 2 评论 -
求二叉树的镜像
分析:首先我们要明白二叉树的镜像是什么?镜像—顾名思义就是从镜子里投出来的样子,我们也每天都照镜子,都知道从镜子里看到的东西它左右都是反的,下面我把二叉树的镜像画出来,你可能就彻底明白了 既然已经知道了二叉树的镜像的形状,那我们就来分析分析代码怎么写吧: 根结点是不用交换的,我们只需要把根节点的左右孩子一交换就行,那我们就需要把根节点的左右子树上的所有结点的左右孩子位置交换 我们下来看看...原创 2018-08-31 22:34:39 · 812 阅读 · 0 评论 -
栈和队列面试题
我们在来看今天的代码之前,相信大家以前可能都封装过栈和队列的基本操作,所以我们在用到一些栈和队列的基本操作的时候,只需要把栈和队列的头文件引进来就可以调用它的一些基本操作的函数,就不用再把那些函数再写一遍了,但在调用栈和队列的头文件的时候,我们必须把栈和队列的头文件和源文件复制到当前这个项目工程底下,不然调不过来。 那我也把栈和队列的那些基本函数给大家放在这吧,便于理解。 Stack.h...原创 2018-08-25 16:04:49 · 290 阅读 · 0 评论 -
优先级队列
PriorityQueue.h#ifndef __PRIORITYQUEUE_H__#define __PRIORITYQUEUE_H__#include"Heap.h"typedef struct PriorityQueue{ Heap hp;}PriorityQueue;void InitPriorityQueue(PriorityQueue* q);void ...原创 2018-09-05 16:27:30 · 99 阅读 · 0 评论 -
100亿个数中找出最大的前K个数(海量数据topK问题)
分析:海量数据topK问题,在我们日常生活中应用非常广泛,比如微信的计步软件,它就是topK问题,统计出前K名,然后进行排序。那如何解决这个问题呢?我们用堆可以很好的解决这个问题。我们先用前K个数建立一个大堆/小堆(找最大前K个数用小堆,找最小前K个数用大堆,因为:如果找最大前K个数,我们建立一个大堆的话,我们需要用第N-K-1个数与堆顶元素比较,如果它比堆顶元素小我们就要舍弃它,但如果它比堆顶元...原创 2018-09-05 16:59:08 · 7869 阅读 · 0 评论 -
堆排序
堆排序:将堆中的数据按照升序/降序排列。在这里也会用到堆的调整、创建操作,具体代码点连接:https://mp.csdn.net/mdeditor/82346337分析:如果我们要按升序排的话,我们要把这个堆建立成大堆,如果我们要按降序排的话,我们要把这个堆建立成小堆。例如:我们要把它排成升序,先把它建立成一个大堆,那堆顶元素就是最大元素了,我们让最后一个元素和堆顶元素交换,那最后一个元素...原创 2018-09-05 17:38:25 · 130 阅读 · 0 评论 -
面向对象的三大特性
Java是面向对象编程封装性:将客观事物封装成抽象的类,每个类都有自己的属性与方法,并且类可以让自己的数据与方法只让可信的类或对象操作,对不可信的进行信息隐藏。内部操作对外部而言不可见(保护性)。继承性:可以使用现有类的所有功能,并且在无需重新编写原有类代码的情况下进行功能上的扩展。多态性:指一个类实例的相同方法在不同情形下有不同的表现形式。好处:多态机制使得具有不同内部结构的对象可以共...原创 2019-01-14 18:31:02 · 137 阅读 · 3 评论