C++
jdq_summer
算法数据结构大数据
展开
-
全局变量、局部变量、静态全局变量、静态局部变量在内存里的区别
static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。一、面向过程设计中的static全局变量、局部变量、静态全局变量、静态局部变量的区别 C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用原创 2013-05-21 14:35:28 · 669 阅读 · 0 评论 -
求1+2+3+...+n,要求不能使用乘除法,for,while,if,else,switch,case等关键字以及条件判断语句
求1+2+3+...+n,要求不能使用乘除法,for,while,if,else,switch,case等关键字以及条件判断语句方法一:利用构造函数和静态数据成员#include using namespace std;class Temp{public: Temp() { ++N; Sum+=N; } static void Reset() {转载 2013-10-07 15:25:20 · 1749 阅读 · 0 评论 -
写一个函数,它的原形是int continumax(char *outputstr,char *intputstr)功能:在字符串中找出连续最长的数字串,并把这个串的长度返回
写一个函数,它的原形是int continumax(char *outputstr,char *intputstr)功能:在字符串中找出连续最长的数字串,并把这个串的长度返回/************************************************************************//* 写一个函数,它的原形是int continumax(char转载 2013-10-07 20:02:26 · 734 阅读 · 0 评论 -
输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来.
这道题的思路参考0-1背包:定义函数F(n,m)来求解这个问题,那么F(n,m)可以分解为两个子问题F(n-1,m)和F(n-1,m-n).由于题目要求列出所有的组合,使用类似动态规划的方法比较复杂,我在这里直接使用递归来解决这个问题。虽然效率可能不是很好,但是代码的可读性还是比较好的。#include "stdafx.h"#include using namespace std;转载 2013-10-07 19:32:41 · 694 阅读 · 0 评论 -
n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始, 每次从这个圆圈中删除第m个数字
题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字。求出在这个圆圈中剩下的最后一个数字。方法一:采用list容器链表存放元素,但是要维护头尾节点的循环。#include #include u原创 2013-10-07 17:19:41 · 1422 阅读 · 0 评论 -
判断整数序列是不是二元查找树的后序遍历结果
题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果: 8 / \ 6 10 / \ / \ 5 7 9 11因此返回true。如果输入7、4、原创 2013-10-07 15:10:37 · 498 阅读 · 0 评论 -
定义Fibonacci数列,输入n,用最快的方法求该数列的第n项
题目:定义Fibonacci数列如下: / 0 n=0f(n)= 1 n=1 / f(n-1)+f(n-2) n=2输入n,用最快的方法求该数列的第n项。分析:在很多C语言教科书中讲到递归函数的时候,都会用Fibonacci作为例子。当递归层次较大时,不适合采用递归,可以堆栈溢出,并且浪费控件,应该采用迭代。1、题目只是求第n项的值,只要求出第n-1和n-2即原创 2013-10-07 19:47:22 · 1366 阅读 · 0 评论 -
输入一个单向链表,输出该链表中倒数第k个结点
题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。链表结点定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;};分析:为了得到倒数第k个结点,很自然的想法是先走到链表的尾端,再从尾端回溯k步。可是输入的是单向链表,只有从前往后的指针而没有从后往转载 2013-10-07 15:33:47 · 1163 阅读 · 1 评论 -
递归与迭代的区别
递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己.一个函数在其定义中直接或间接调用自身的一种方法,它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决,可以极大的减少代码量.递归的能力在于用有限的语句来定义对象的无限集合.使用递归要注意的有两点:1)递归就是在过程或函数里面调用自身;2)在使用递归时,必须有一个明确的递归结束条件转载 2013-09-22 18:14:14 · 465 阅读 · 0 评论 -
在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。
题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。 分析:这道题是2006年google的一道笔试题。采用容器map很好的解决了这个问题,first存放字符,second存放数量#include #include #include using namespace std;void GetcharCount( const string& st原创 2013-10-07 16:58:02 · 901 阅读 · 1 评论 -
算法面试题
1.把二元查找树转变成排序的双向链表 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ / \4 8 12 16 转换成双向链表4=6=8=10=12=14=16。 首先我们定义的二元查找树 节点的数据结构如下: struct BSTree转载 2013-10-07 19:40:49 · 1553 阅读 · 0 评论 -
0长度char数组的使用
需要引起注意的:ISO/IEC 9899-1999里面,这么写是非法的,这个仅仅是GNU C的扩展,gcc可以允许这一语法现象的存在。 结构体最后使用0或1的长度数组的原因,主要是为了方便的管理内存缓冲区,如果你直接使用指针而不使用数组,那么,你在分配内存缓冲区时,就必须分配结构体一次,然后再分配结构体内的指针一次,(而此时分配的内存已经与结构体的内存不连续了,所以要分别管理即申请和释放)而如转载 2016-05-05 10:08:48 · 405 阅读 · 0 评论 -
C语言变量声明加冒号的用法(占位符)
有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几 个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域转载 2016-05-05 10:07:36 · 795 阅读 · 0 评论 -
乱码问题的解决
我们经常会遇到中文显示出现乱码问题,assic是单字节编码,经常需要将其转换为Unicode,不然会出现乱码问题。WCHAR * AnsiToUnicode(const CHAR * lpszStr){ WCHAR * lpUnicode; int nLen; if (NULL == lpszStr) return NULL; nLen = ::MultiByteToWi原创 2013-10-25 15:22:23 · 454 阅读 · 0 评论 -
4.给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数
4.给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数问题分析:现在给了一个能随机生成1~5的随机函数,怎样利用这个已知条件生成一个1~7的随机函数呢?既然要生成的是随机数那么生成1,2,3,4,5,6,7的概率就应该是一样的。显然现在光生成1~5之间的数就不够了,我们想到应该要加大生成数的范围,并且加大范围的同时还要保证每个数产生的概率一样,于是有这样一种方法用这个表达式转载 2013-10-15 11:54:31 · 856 阅读 · 0 评论 -
数据结构排序
数据结构排序这章内容比较经典,都是一些很好的算法,将来很可能会用得到,总结一下,加深一下印象。 文章篇幅有点大,请点击查看更多,下面是跳转链接: 一、插入排序 1)直接插入排序 2)折半插入排序 3)希尔排序 二、交换排序 1)冒泡排序 2)快速排序 三、选择排序 1)简单选择排序 2)堆排序 四、归并转载 2013-09-26 17:05:41 · 418 阅读 · 0 评论 -
Lua脚本语法说明
Lua脚本语法说明(增加lua5.1部份特性) Lua 的语法比较简单,学习起来也比较省力,但功能却并不弱。 所以,我只简单的归纳一下Lua的一些语法规则,使用起来方便好查就可以了。估计看完了,就懂得怎么写Lua程序了。 在Lua中,一切都是变量,除了关键字。I. 首先是注释 写一个程序,总是少不了注释的。 在Lua中,你可以使用单行注释和多行注释。转载 2013-10-10 10:57:07 · 582 阅读 · 0 评论 -
duilib库
要使用duilib库,必须先把库导入,代码如下: 1 #include "xxx\UIlib.h" //xxx为UIlib.h的路径 2 using namespace Duilib; //Duilib为库自定义的名字空间 3 4 #ifdef _DEBUG 5 #ifdef _UNICODE 6 #pragma comment(lib, "xxx\Duilib_ud转载 2013-10-09 17:00:51 · 1255 阅读 · 0 评论 -
整数的二进制表示中1的个数
整数的二进制表示中1的个数题目:输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。分析:这是一道很基本的考查位运算的面试题。1、每次向右移动一位。2、测试最低位是否为1 :n&1;如果为1,则最低位为1,count++;int test(int n){ int count=0;原创 2013-10-07 20:29:04 · 623 阅读 · 0 评论 -
STL详解
STL就是Standard Template Library,标准模板库。这可能是一个历史上最令人兴奋的工具的最无聊的术语。从根本上说,STL是一些“容器”的集合,这些“容器”有list, vector,set,map等,STL也是算法和其它一些组件的集合。这里的“容器”和算法的集合指的是世界上很多聪明人很多年的杰作。是C++标准库的一个重要组成部分,它由Stepanov and Lee等人最转载 2013-09-22 11:39:33 · 1111 阅读 · 0 评论 -
有两个有序的单链表,将它们合并为一个有序的单链表,不允许分配额外空间
题目:有两个有序的单链表,将它们合并为一个有序的单链表,不允许分配额外空间。分析: 这一道题应该很简单,不分配额外空间是很容易满足的。数据结构课本上就有这样的实现,具体不多说,看参考代码: 1: struct Node 2: { 3: int value; 4: struct Node* next; 5: }; 6: 7转载 2013-10-07 19:54:27 · 1446 阅读 · 0 评论 -
如何在编译器(vs2008)里设置调用别人写好的lib和dll
如何在编译器(vs2008)里设置调用别人写好的lib和dll步骤:1.Tools->options->projects and solutions->VC++ directories分别在包含文件,库文件填加了路径 (这些路径只告诉编译器怎么找文件,没有说把那里面的文件加入工程.) (若不设置,编译报错:无法打开***文件)转载 2013-08-26 10:05:16 · 673 阅读 · 0 评论 -
多线程网络编程
最近学习了网络编程,在学习多线程技术后,就尝试着用多线程技术写了一个网络聊天程序。下面介绍一下具体的实现过程。 既然是聊天程序,肯定要发送数据和接收数据,这里我新创建了一个线程来接收数据,用主线程来发送数据。同一个进程中的两个线程可以独立运行并相互交通信。因此可以实现数据的接收和发送。 先建立一个基于对话框的应用程序,并在对话框上放置接收数据的编辑框、发送数据的编辑框、转载 2013-07-17 15:48:30 · 673 阅读 · 0 评论 -
++iter与iter++性能上的区别
在C++标准库中经常使用到迭代器,所以也即离不开递增运算符操作。因此我们应该使用++iter还是iter++呢?我们应该尽可能的优先选用前置式递增运算符(++iter)而不是后置式递增运算操作符(iter++)因为前者性能更好,前置递增运算操作符不需传回旧值,所以也就不必花费一个临时对象来保存旧值。该规则同样适合递增运算符原创 2013-05-28 20:10:55 · 1193 阅读 · 0 评论 -
string大小写转换
将一个string转换成大写或者小写,是项目中经常需要做的事情,但string类里并没有提供这个方法。自己写个函数来实现,说起来挺简单,但做起来总让人觉得不方便。打个比方:早上起来想吃个汉堡,冰箱里有生牛肉,有面粉,也有微波炉,是可以自己做的,但是实在是太费事,没几个人愿意做。但是,打个电话给肯德基宅急送,10分钟后就有热乎乎的汉堡送上门了,大大节省了时间(时间就是金钱,你可以将时间用在更重要的开转载 2013-05-12 17:08:56 · 457 阅读 · 0 评论 -
求质数
#include #include #include using namespace std;bool primer( int a ){ if( a==0 || a==1 || a==2 || a==3 ) return true; int k = a/2; for( int i=2; i<=k && a%i!=0; i++ ) ; if原创 2013-05-11 22:17:52 · 470 阅读 · 0 评论 -
如何把string的元素逆序
论坛里见到这个问题:如何把string的元素逆序?我直接想到的是利用反向迭代器reverse_iterator:rbegin()和rend():[cpp] view plaincopyprint?string str1("1234567890");string str2(str1.rbegin(), str1.rend()); string str1("转载 2013-05-11 09:47:21 · 1393 阅读 · 0 评论 -
CString与char*之间的转换
CString 头文件#include string 头文件#include CString 转char *CString cstr;char *p = (LPSTR)(LPCTSTR)cstr;string 转 CStringCString.format(”%s”, string.c_str());char 转 CStringCString.format(”%s”转载 2013-05-09 17:02:03 · 473 阅读 · 0 评论 -
堆和栈区别
1、分配方式不同:栈: 由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间堆: 需要程序员自己申请,并指明大小,在c中malloc函数如p1 = (char *)malloc(10);在C++中用new运算符如p2 = (char *)new(10);但是注意p1、p2本身是在栈中的。2、空间大小不同:转载 2013-05-21 13:14:50 · 424 阅读 · 0 评论 -
使用C++处理JSON数据交换格式
使用C++处理JSON数据交换格式一、摘要 JSON的全称为:JavaScript Object Notation,顾名思义,JSON是用于标记Javascript对象的,JSON官方的解释为:JSON是一种轻量级的数据传输格式。本文并不详细介绍JSON本身的细节,旨在讨论如何使用C++语言来处理JSON。关于JSON更具体的信息,可参见JSON官网:http://www.json.转载 2013-09-30 14:41:28 · 803 阅读 · 0 评论 -
UTF8与GB2312
utf-8转换到GB3212char* U2G(const char* utf8){ int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0); wchar_t* wstr = new wchar_t[len+1]; memset(wstr, 0, len+1); MultiByteToWideChar(CP_UTF原创 2013-09-30 15:18:36 · 592 阅读 · 0 评论 -
输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。
输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字M,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。思路:(1)让指针指向数组的头部和尾部,相加,如果小于M,则增大头指针,如果大于则减小尾指针(2转载 2013-10-07 15:41:29 · 740 阅读 · 0 评论 -
把二元查找树转变成排序的双向链表
1、把二元查找树转变成排序的双向链表 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。10/ \6 14/ \ / \4 8 12 16转换成双向链表4=6=8=10=12=14=16。首先我们定义的二元查找树节点的数据结构如下:struct BSTreeNode{int m_n原创 2013-10-07 09:00:36 · 528 阅读 · 0 评论 -
查找最小的k个元素
查找最小的k个元素题目:输入n个整数,输出其中最小的k个。例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。1、输入元素,并排序2、输出前k个元素排序:采用高效的排序方法,如:快速排序,归并排序等方法一:采用最简单的方法#include#include#includeusing namespace std;i原创 2013-10-07 12:37:14 · 513 阅读 · 0 评论 -
求子数组的最大和
题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。1、当累加和出现负数时,应该重置为零,重新求和2、不断更新最大值原创 2013-10-07 09:39:15 · 729 阅读 · 0 评论 -
在二元树中找出和为某一值的所有路径
4.在二元树中找出和为某一值的所有路径题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如 输入整数22和如下二元树 10 / \ 5 12 / \ 4 7则打印出两条路径:10, 12和10, 5, 7。二元树节点的数据结构原创 2013-10-07 10:56:34 · 518 阅读 · 0 评论 -
0-1装载问题求得最优解
一,问题描述 有一批共n个集装箱要装上2艘载重量分别为c1和c2的轮船上,其中集装箱i的重量为wi,且w1+w2+...+wn 装载问题要求确定,是否有一个合理的装载方案可将这n个集装箱装上2艘轮船。如果有,找出一种装载方案。 例如,当n=3,c1=c2=50,且w=[10,40,40]时,可将集装箱1和集装箱2装上一艘轮船,而将集装转载 2013-10-04 16:55:27 · 2091 阅读 · 0 评论 -
求一个字符串中连续出现次数最多的子串
vector向量中的插入值如上图所示:#include #include #includeusing namespace std;pair fun(const string &str){vector substrs;int maxcount=1,count=1;string substr;int i,len=str.length();for(i=0;转载 2013-10-03 12:19:47 · 620 阅读 · 0 评论 -
逆序输出字符串
逆序输出字符串#include #include #include using namespace std; // 按字符反转字符串 void reverse_char(char *str) { int nlen = strlen(str); char tmp; for (int i = 0; i < nlen/2; ++i)原创 2013-10-01 16:51:31 · 711 阅读 · 0 评论 -
多线程编程--- __thread关键字
__thread是GCC内置的线程局部存储设施,存取效率可以和全局变量相比。__thread变量每一个线程有一份独立实体,各个线程的值互不干扰。可以用来修饰那些带有全局性且值可能变,但是又不值得用全局变量保护的变量。 __thread使用规则:只能修饰POD类型(类似整型指针的标量,不带自定义的构造、拷贝、赋值、析构的类型,二进制内容可以任意复制memset,memcpy,且内转载 2016-05-06 09:33:31 · 395 阅读 · 0 评论