算法总结
针对算法/数据结构的一些思考
BIG_GENERAL_DD
好好学习,天天向上.
展开
-
输入一个带有若干空格的字符串
最近在做一道关于字符串的题目时,总会用到 string,而忽略了对string的一些基本用法。string是不能够统计一个空格字符的。eg:string s;cin>>s;//假设你输入“I am a boy”,那么对于s这个字符串变量只能取“I”这一个单词。那对于输入一个带有空格的字符串,应该这么做?通过网上查询一些相关资料,有如下的一些方法:第一种方原创 2017-03-03 20:52:43 · 1005 阅读 · 0 评论 -
字符串的旋转
对于一个字符串,和字符串中的某一位置,请设计一个算法,将包括i位置在内的左侧部分移动到右边,将右侧部分移动到左边。给定字符串A和它的长度n以及特定位置p,请返回旋转后的结果。测试样例:"ABCDEFGH",8,4返回:"FGHABCDE"fgets(buf,sizeof(s),stdin)stdin表示标准输入,是一个FILE类型。fge原创 2017-07-25 23:16:14 · 302 阅读 · 0 评论 -
单列模式
1. 下面说法正确的是(A)A 一个空类默认一定生成构造函数,拷贝构造函数,赋值操作符,引用操作符,析构函数。B可以有多个析构函数C 析构函数可以为virtual,可以被重载D 类的构造函数如果都不是public访问属性,则类的实例无法创建分析: A 不严谨,参考《深度探索C++对象模型》第二章 构造函数语义学。“在需要的时候被编译器生产出来”’ 一个类是空类,没有原创 2017-07-27 09:46:40 · 308 阅读 · 0 评论 -
关于 *(&a+1) 与 *(a+1)区别
关于一个int *ptr=(int *)(&a+1)问题的探讨#includeusing namespace std;main(){int a[5]={1,2,3,4,5};int *ptr=(int *)(&a+1);printf("%d,%d",*(a+1),*(ptr-1));}输出为:2,5请解释以上代码的输出结果。答案如下:原创 2017-07-27 10:40:15 · 2741 阅读 · 0 评论 -
类的静态成员
《C++ Primer》第五版P268~P271静态成员(静态数据成员和静态成员函数)可以是public、private。静态数据成员的类型可以是常量、引用、指针、类类型。类的静态成员存在于任何对象之外,对象中不包含任何与静态数据成员有关的数据。静态成员函数不与任何对象绑定在一起,它们不包含this指针。作为结果,静态成员函数不能声明为const,也不能在stati原创 2017-07-27 15:47:29 · 663 阅读 · 0 评论 -
动态内存和智能指针
《C++ Primer》第五版P399全局对象在程序启动时分配,程序结束时销毁。局部变量,进去其定义所在的程序块时被创建没在离开块时销毁。局部static对象在第一次使用前分配,在程序结束时销毁。动态分配的对象的生存期与它们在哪里创建是无关的,只有当显式地被释放时,对象才会销毁。为安全使用动态对象,标准库定义了两个智能指针类型来管理动态分配的对象。当一个对象一个被释放时,指原创 2017-07-27 18:02:02 · 284 阅读 · 0 评论 -
关于堆排序的一些思考
最近在做个堆排序的时候有点疑惑,疑惑在于对一个乱序数组利用堆排序使之有序。先了解两个概念:小顶堆(根结点的值小于子结点的值)和大顶堆(根结点的值大于子结点的值)。n个元素的序列{k1,k2,…,kn}当且仅当满足下列关系之一时,称之为堆。 情形1:ki 2i 且ki 2i+1 (最小化堆或小顶堆) 情形2:ki >= k2i 且ki >= k2i+1原创 2017-07-29 11:50:24 · 364 阅读 · 0 评论 -
C++面试必知必会(3)-程序改错
1 对下列程序改错#includeint main() { char *src="hello,world"; char *dest=NULL; int len=strlen(src); dest=(char *)malloc(len); char *d=dest; char *s=src[len]; while(len--!=0) d++=s--; printf("%s原创 2017-09-23 14:05:37 · 1928 阅读 · 0 评论 -
由两道题所引起的一些思考
1、写一个函数计算当参数n(很大)时的值:1-2+3-4+5-6+……+n思路:下述方法是一个比较正常的思路。long fn(long n) { long temp=0; int i,flag=1; if(n<0) { printf("error:n must >0"); exit(1); } for(i=1;i<=n;i++) { temp=temp+falg*i;原创 2017-09-15 14:49:12 · 212 阅读 · 0 评论 -
C++中基类的虚函数的一些思考
先看下述程序:#includeusing namespace std;class ClxBase{public: ClxBase() {}; virtual ~ClxBase() {}; virtual void DoSomething() { cout << "Do something in class ClxBase!" << endl; };};原创 2017-09-15 16:52:15 · 566 阅读 · 0 评论 -
C++面试必知必会 (2)
1 不能做switch()的参数类型是什么数据类型?switch(表达式),表达式可以是整型、字符型以及枚举类型等表达式。switch()的参数不能是实型。2 static VS. conststatic:(1)函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值。(2)在模块内的static全局原创 2017-09-21 10:19:41 · 397 阅读 · 0 评论 -
C++面试必知必会 (1)
1、介绍STL,说明STL如何实现vector。STL,标准模板库。由容器算法迭代器组成。优点:容易实现搜索数据或对数据排序等一系列算法。 调试程序安全、方便。 STL是跨平台的。vector实质是一个动态数组,会根据数据增加,动态增加数组空间。2、分析Visual C++程序出错的原因:(1)所引用的函数、变量不存在、拼写不正确或者使用错误。原创 2017-09-15 22:27:34 · 368 阅读 · 0 评论 -
二叉树的递归遍历与非递归遍历
递归遍历中序遍历中序遍历(LDR)是二叉树遍历的一种,也叫做中根遍历、中序周游。在二叉树中,先左后根再右。巧记:左根右。树中结点结构为typedef struct TreeNode { int data; struct TreeNode *left; struct TreeNode *right; struct TreeNode *p原创 2017-08-31 16:14:45 · 504 阅读 · 0 评论 -
STL容器学习
标准库中的容器分为顺序容器和关联容器。顺序容器(sequential container)内的元素按其位置存储和访问,顾名思义,这些内部元素是顺序存放的;顺序容器内的元素排列次序与元素值无关,而是由元素添加到容器里的次序决定。而关联容器的元素按键(key)排序。顺序容器类型:vector、list、deque,顺序容器适配器类型:stack、queue、priority_queue。转载 2017-07-25 15:16:01 · 283 阅读 · 1 评论 -
STL基础学习之vector、stack、deque、list总结
最近又在复习push_back(),push()方法的时候,查阅一些资料把STL中的一些容器方法创新复习总结了一下。C++ push方法与push_back方法 浅析c++ stl栈容器stack的pop(),push()等用法介绍及头文件push_back 方法介绍vector::void push_back (const value_type& va原创 2017-08-02 12:24:41 · 461 阅读 · 0 评论 -
关于全排列升降序的一些思考
在练习 《ADV-66 算法提高 阮小二买彩票》问题所求 “组成正整数N的所有位数的全排列,这些排列按升序输出,每个排列占一行。” 此题与 《排列数(输出0~9的全排列)-算法提高》中所求问题 “求0~9十个数的全排列中的第n个(第1个为0123456789) ”是一样的。此处可以利用 在algorithm里面中的next_permutation函数(该函数可以自动实现升序全排列原创 2017-03-03 21:02:37 · 797 阅读 · 0 评论 -
区间K好数 总结
区间K好数 总结1题目中要求“序列元素从1开始标号”,但自己在原先的程序上调试了好几遍总是运行错误。主要原因出现在sort()函数,该函数对于排序似乎只能从 一个序列号从0开始的数组,对于以1为开始的序列数组,总是最终出现错误。eg:int cmp(int a, int b){return a > b;} int *b = new int [n];原创 2017-03-15 19:42:29 · 338 阅读 · 0 评论 -
static对程序运行影响
静态成员static#includeusing namespace std;void f() { static int i=15; i++; cout<<"i="<<i<<endl; }int main() { for(int k=0;k<2;k++) f(); return 0;} i=16i=17#includeusing names原创 2017-04-15 09:15:09 · 512 阅读 · 0 评论 -
位操作学习的一些困惑
点击打开链接 《位操作基础篇之位操作全面总结》对于移位操作,在微软的VC6.0和VS2008编译器都是采取算术称位即算术移位操作,算术移位是相对于逻辑移位,它们在左移操作中都一样,低位补0即可,但在右移中逻辑移位的高位补0而算术移位的高位是补符号位。如下面代码会输出-4和3。#include #include int main(){ int a = -15, b原创 2017-06-20 12:34:42 · 259 阅读 · 0 评论 -
辨析B树(B-、B+、B*)
B- 树 是一种多路搜索树(并不是二叉的): 1. 定义任意非叶子结点最多只有 M 个儿子;且 M>2 ; 2. 根结点的儿子数为 [2, M] ; 3. 除根结点以外的非叶子结点的儿子数为 [M/2, M] ; 4. 每个结点存放至少 M/2-1(取上整)和至多 M-1 个关键字;(至少 2 个关键字)转载 2017-06-21 14:56:07 · 636 阅读 · 0 评论 -
动态内存分配
动态内存分配全局变量是分配在内存中的静态存储区,非静态的局部变量(包括形参)是分配在动态存储区的,此存储区晚上栈(stack)。除此,C语言还允许建立内存动态分配区域,以存放一些临时用的数据,这些数据不必在程序的声明中部分定义,也不必等待函数结束时释放,而是需要时随时开辟,不需要时随时释放,此数据是堆(heap)。 对内存动态分配是通过系统提供的哭喊是实现,主要有malloc,原创 2017-06-09 18:13:52 · 325 阅读 · 0 评论 -
野指针
野指针,也就是指向不可用内存区域的指针。通常对这种指针进行操作的话,将会使程序发生不可预知的错误。“野指针”不是NULL指针,是指向“垃圾”内存的指针。野指针的成因主要有两种:(1)、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存原创 2017-06-11 10:15:41 · 264 阅读 · 0 评论 -
图的概念与遍历
1.线性表中的数据元素叫元素;树中数据元素叫结点;图中数据元素叫顶点。(线性表和树可以为空,图不可以为空)2.树中根结点到任意结点的路径是唯一的,但是图中顶点与顶点之间的路径却是不唯一的。路径长度是路径上的边或弧的数目。第一个顶点到最后一个顶点系相同的路径称为回路或环。序列中顶点不重复出现的路径称为简单路径。除了第一个顶点和最后一个顶点外,其余顶点不重复出现的回路称为简单回路或原创 2017-06-26 16:04:49 · 409 阅读 · 0 评论 -
IP和子网掩码
IP和子网掩码6. 命令 subnet166.173.197.131 netmask 255.255.255.192{range166.173.197.10 166.173.197.107;default-lease-time600;max-lease-time7200;}表示?()A.向166.173.197.10网转载 2017-07-29 16:48:47 · 510 阅读 · 0 评论 -
如何确认同一网段
IP和子网掩码、同一网段中提到 如何通过计算IP地址和 子网掩码来验证网络是否在同一段中,在此处都提到了同一个例子。同一网段指的是IP地址和子网掩码相与得到相同的网络地址。想在同一网段,必需做到网络标识相同。各类IP的网络标识算法都是不一样的,需要根据子网掩码的位数来判断。算法只要把IP和子网掩码的每位数AND就可以了。AND方法:0和1=0 0和0原创 2017-07-29 18:37:01 · 7862 阅读 · 0 评论 -
实现二进制代码块的复制
(单选题) 以下哪个函数可以在源地址和目的地址的位置任意的情况下,在源地址和目的地址的空间大小任意的情况下实现二进制代码块的复制? A memcpy() B memmove()C memset() D strcpy()memcpy与memmove的目的都是将N个字节的源内存地址的内容拷贝到目标内存地址中。 但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmo原创 2017-07-30 12:55:40 · 1059 阅读 · 0 评论 -
常量折叠
分析下列程序:#includeusing namespace std;int main() { const int a=10; int *p=(int *)(&a); *p=20; cout<<"a="<<a<<",*p"<<*p<<endl; return 0;}输出结果: a=10,*p=10;分析:因为a 和p都指向相同的内存地址,所以输出的前两个结果是相同的,但原创 2017-07-30 14:10:28 · 249 阅读 · 0 评论 -
史上最全最丰富的“最长公共子序列”、“最长公共子串”问题的解法与思路
花了一天时间把一直以来的“最大子序列”、“最大递增子序列“、”最大公共子序列“、“最长公共子串”等问题总结了一下。其中参考了若干博文,都备注引用。首先子序列是指一个一个序列中,由若个数(字母)组成,然后从中任意删掉几个数(字母),保留剩下的数(字母)构成了一个序列,即称子序列。(或者从一个序列中,任意选取若干数或字符,按照这些数或字符原来的排序组成新的序列,即称子序列)子串是指在一个字符串原创 2017-07-31 20:12:32 · 29320 阅读 · 6 评论 -
工程项目常见的知识点(1)
(一)、关于override的用法,是对 父类中的 虚方法的重写覆盖。 override(重写,覆盖) (1)方法名、参数、返回值相同。 (2)子类方法不能缩小父类方法的访问权限。 (3)子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)(4)存在于父类和子类之间。 (5)方法被定义为final不能被重写。 (6)被覆盖的方法不能为priv...原创 2018-07-19 18:42:00 · 315 阅读 · 0 评论