c++
zqt520
这个作者很懒,什么都没留下…
展开
-
从1到N正数中1出现的次数
一问题描述:求1到n中,十进制数中,1出现的次数总和 方法1 对每一个数x,x先与10取余,然后判断x/10之后,是否为0,不为0则继续上述操作 复杂度为o(n) 方法2: 此题不要以为是重复计数,必须要重复计数,,因为100001 ,这个数字,需要记两次,一次首位为1,另一次不计首位,后几位为1. 这样的话,就有重复计转载 2012-10-01 12:56:58 · 1492 阅读 · 0 评论 -
进程,轻量级进程,内核线程,用户线程的区别关系
进程,轻量级进程,内核线程,用户线程的区别关系在现代操作系统中,进程支持多线程。进程是资源管理的最小单元;而线程是程序执行的最小单元。一个进程的组成实体可以分为两大部分:线程集合资源集。进程中的线程是动态的对象;代表了进程指令的执行。资源,包括地址空间、打开的文件、用户信息等等,由进程内的线程共享。线程有自己的私有数据:程序计数器,栈空间以及寄存器。Why Thread?(传统单线程进原创 2012-10-04 22:37:41 · 582 阅读 · 0 评论 -
gprof介绍
gprof介绍gprof是GNU profiler工具。可以显示程序运行的“flat profile”,包括每个函数的调用次数,每个函数消耗的处理器时间。也可以显示“调用图”,包括函数的调用关系,每个函数调用花费了多少时间。还可以显示“注释的源代码”,是程序源代码的一个复本,标记有程序中每行代码的执行次数。为gprof编译程序在编译或链接源程序的时候在编译器的命令行参数原创 2012-10-04 23:55:02 · 480 阅读 · 0 评论 -
大数运算
最近在做OJ题时遇到了一个求阶乘的题,看到数据范围时惊了我一跳,题目要求输入一个整数N求N!,其中N的范围为0=。我们要知道21!已经超过64位整数的范围了,那10000!将会是多么大的数据。于是我就想到了,大数乘法!大数运算有很多方式。一种方式是利用字符串数组存放数据,即每一个字节存放一位10进制数,然后模拟我们手算方式进行计算。大数加法(10进制法)char a[100原创 2012-09-14 00:29:43 · 556 阅读 · 0 评论 -
strstr
char *strstr(const char *s1, const char *s2) { int n; if (*s2) { while (*s1) { for (n = 0; *(s1 + n) == *(s2 + n); n++) { if (!*(s2 + n + 1)) return (char *) s1;原创 2012-10-04 22:05:59 · 383 阅读 · 0 评论 -
Linux中的clone()函数
int clone(int (*fn)(void *), void *child_stack, int flags, void *arg);这里fn是函数指针,我们知道进程的4要素,这个就是指向程序的指针,就是所谓的“剧本", child_stack明显是为子进程分配系统堆栈空间(在linux下系统堆栈空间是2页面,就是8K的内存,其中在这块内存中,低地址上放入了值,这个值就是进程控制块t原创 2012-10-04 23:27:45 · 752 阅读 · 0 评论 -
Linux 多线程通信
摘自资料(linux 与Windows不同) 线程间无需特别的手段进行通信,因为线程间可以共享数据结构,也就是一个全局变量可以被两个线程同时使用。不过要注意的是线程间需要做好同步,一般用mutex。可以参考一些比较新的UNIX/Linux编程的书,都会提到Posix线程编程,比如《UNIX环境高级编程(第二版)》、《UNIX系统编程》等等。 linux的消息属于IPC,也就是进程间原创 2012-10-04 22:55:40 · 891 阅读 · 0 评论 -
c++100题
用C++写个程序,如何判断一个操作系统是16位还是32位的?不能用sizeof()函数。 【参考答案】 int a = ~0;if( a>65536 ){ cout<<"32 bit"<<endl;}else{ cout 多态类中的虚函数表是Compile-Time,还是Run-Time时建立的? 【标准答案】虚拟函数表是在编译期就原创 2012-10-08 00:07:15 · 1053 阅读 · 1 评论 -
关于union
先从两个例子讲起:例一:union u{ int i; char x[2];}a; int main(){ a.x[0] = '1'; a.x[1] = '2'; printf("%d\n", a.i); return 0;}结果打印出一个地址原创 2012-10-08 23:21:48 · 595 阅读 · 0 评论 -
一些C++ 面试的题目收藏
1 #i nclude “filename.h”和#i nclude 的区别?#i nclude “filename.h”表明该文件是用户提供的头文件,查找该文件时从当前文件目录开始;#i nclude 表明这个文件是一个工程或标准头文件,查找过程会检查预定义的目录。2 头文件的作用是什么?答:一、通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要转载 2012-10-08 23:34:04 · 1224 阅读 · 0 评论 -
100题之旋转数组中的最小元素
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。分析:这道题最直观的解法并不难。从头到尾遍历数组一次,就能找出最小的元素,时间复杂度显然是O(N)。但这个思路没有利用输入数组的特性,我们应该能找到更好的解法。转载 2012-10-02 16:49:22 · 462 阅读 · 0 评论 -
求一个矩阵中最大的二维矩阵(元素和最大)
一,题目:求一个矩阵中最大的二维矩阵(元素和最大).如:1 2 0 3 42 3 4 5 11 1 5 3 0中最大的是:4 55 3要求:(1)写出算法;(2)分析时间复杂度;(3)用C写出关键代码二,分析: 假设最大子矩阵的结果为从第r行到k行、从第i列到j列的子矩阵,如下所示(ari表示a[r][i],假设数组下标从1开始):转载 2012-10-01 16:10:47 · 607 阅读 · 0 评论 -
判断二叉树中两个节点的最低共同父节点
只要找到这样一个节点:已知的两个节点一个在它的左边子树,一个在它的右边子树;或者这个节点就是已知的两个节点中的一个,而另一个恰好在它的下面。TREE* CommonFather(TREE *root, TREE *A, TREE *B){ if(root == NULL) return root; if(root == A)//如果找到A,转载 2012-10-03 10:46:46 · 1000 阅读 · 0 评论 -
交换两序列a,b中的元素,使序列a的和与序列b的和之间的差值最小
题目: 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。例如: var a=[100,99,98,1,2, 3];var b=[1, 2, 3, 4,5,40];求解思路: 当前数组a和数组b的和之差为 A = sum(a) - sum(b)转载 2012-10-01 15:18:47 · 2735 阅读 · 0 评论 -
二叉树的深度(递归+非递归)
递归实现基本思想:为了求得树的深度,可以先求左右子树的深度,取二者较大者加1即是树的深度,递归返回的条件是若节点为空,返回0算法:int FindTreeDeep(BinTree BT){ int deep=0; if(BT){ int lchilddeep=FindTreeDeep(BT->lchild); in转载 2012-10-02 11:31:43 · 6712 阅读 · 1 评论 -
寻找丑数
题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第2012个丑数。 分析:这是一道在网络上广为流传的面试题,据说google曾经采用过这道题。//主程序有两个算法//第一个算法很朴素,从1开始判断,时间较长//第二个算法省去了不是丑数的判断,但是转载 2012-10-02 15:04:48 · 646 阅读 · 0 评论 -
颠倒栈
题目:用递归颠倒一个栈。例如输入栈{1, 2, 3, 4, 5},1在栈顶。颠倒之后的栈为{5, 4, 3, 2, 1},5处在栈顶。分析:乍一看到这道题目,第一反应是把栈里的所有元素逐一pop出来,放到一个数组里,然后在数组里颠倒所有元素,最后把数组中的所有元素逐一push进入栈。这时栈也就颠倒过来了。颠倒一个数组是一件很容易的事情。不过这种思路需要显示分配一个长度为O(n)的数组,而且转载 2012-10-02 15:41:55 · 752 阅读 · 2 评论 -
求有N种颜色的珠子串中包含所有颜色的最短子串
一串首尾相连的珠子(m 个),有N种颜色(N并分析时间复杂度与空间复杂度。#include #include #define MAXN 10int findMinBeadSeq(int arr[],int len,int colorsNeed){ //count表示当前颜色个数,c[arr[i]]表示,arr[i]这种颜色有几个 int c[MAXN],count=0; int转载 2012-10-01 21:31:52 · 1481 阅读 · 0 评论 -
CMyString的实现
面向对象的编程,首先得设计出良好的类体结构和接口,然后是合理的实现.如何自己设计并实现一个字符串类?这个问题看似简单,其实里面也有不少的玄机.class CMyString { public: CMyString(char* pStr = NULL); CMyString(const CMyString& rhs); CMyString& oper转载 2012-10-02 11:19:51 · 680 阅读 · 0 评论 -
C++中设计一个类,使其不能继承
ava中有一种类不能被继承,那就是final类.而C++中没有final类。 C++要实现一个不能被继承的类有很多方法. 主要的思路就是使子类不能构造父类的部分,这样子类就没有办法实例化整个子类.这样就限制了子类的继承. 所以我们可以将父类的构造函数声明成为私有的,但是这样父类不就不能实例化,继续思考、、、 我们可以利用友员不能被继承的特性! 首先假设CParen转载 2012-10-02 12:43:09 · 841 阅读 · 0 评论 -
在O(1)时间内删除链表结点
题目:给定链表的头指针和一个结点指针,在O(1)时间内删除该结点,链表结点的定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;};函数的声明如下:void DeleteNode(ListNode *pListHead, ListNode *pToBeDeleted);答:#includ转载 2012-10-02 12:49:56 · 1406 阅读 · 1 评论 -
经典算法题--求对策字符串的最大长度
方法一:思路很中规中矩,遍历这个字符串,若有发现相邻的两个字符相等,就循环判断与这两个字符相邻的两个字符是否相等, 直到不等,记下字符符合条件的字符个数。最大的个数即为所求。(此方法适合如google这样的字符串)int counterplan1(const string str) { int strlen=str.length(); int maxlen=0转载 2012-10-02 21:41:27 · 600 阅读 · 1 评论 -
二叉树
#include "iostream"#include "stdlib.h"#include "stdio.h"#include "malloc.h"#define STACK_INIT_SIZE 5#define STACKINCREMENT 1#define OK 1#define NULL 0using namespace std; typedef str原创 2012-09-17 22:48:59 · 387 阅读 · 0 评论 -
字节序(大端小端)的判断和转换
关键是big endian和little endian的概念。注意16bit机器和32bit机器(以32位为访问单位)下排列不同。内存地址从低地址向高地址增长,big endian是高位数据优先,即高位放在低地址。而little endian是低位数据优先,低位放在低地址。网络字节序采用大端。判断字节序:main(){ int x = 0x1; if ((*(char *)转载 2012-09-19 00:04:02 · 925 阅读 · 0 评论 -
中兴软件研发面试
1. 下面这段代码的输出是多少(在32位机上). char *p; char *q[20]; char *m[20][20]; int (*n)[10]; struct MyStruct{char dda;double dda1;int type ;};MyStruct k;转载 2012-10-09 20:35:37 · 869 阅读 · 0 评论 -
C语言变量存储类型auto,static,extern,static extern,register
C语言变量存储类型autostaticexternstatic externregisterauto 局部变量 auto 变量是用堆栈(stack)方式占用储存器空间,因此,当执行此区段是,系统会立即为这个变量分配存储器空间,而程序执行完后,这个堆栈立即被系统收回.在大括号{}内声明. 自动变量就是指在函数内部定义使用的变量。他只是允许在定义他的函数转载 2013-05-17 22:29:10 · 592 阅读 · 0 评论 -
深入理解C语言——#define宏和枚举的区别
今天在书上看到了这个问题,回去特地查了一下工具书,结合其他参考资料,特此总结了一下#define宏和枚举的区别,今把它成文与本人博客,与大家一起分享。(1)从处理过程的角度看:#define宏是由编译预处理器在预编译处理时处理的,而且只做简单的字符串的替换。枚举常量则是在编译的时候确定其值的。(2)从调试的角度看:通常情况下,在编译器里,可以调试枚举常量,而不能调试转载 2013-05-17 22:29:59 · 553 阅读 · 0 评论 -
程序的链接和加载基础(1)
1. 程序的链接 程序链接的核心是找“符号”,即函数或者变量定义的位置。“符号”可能位于其它程序文件,静态库,动态库,如果没找到,编译器可能报错,还可能帮你生成一个。 1.1 窥豹一斑 c++的extern关键字 c++编写的so,希望在c中使用。因为某种原因,c中只能用gcc编译器。 $ cat e.cccons转载 2013-09-30 14:52:31 · 905 阅读 · 0 评论 -
设置进程的显示名称
一直觉得nginx显示master和worker进程名字的方式很酷,一目了然,相比之下apache就逊色一点。root 23340 1 0 May24 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginxnobody 23341 23340 0 May24 ? 0原创 2013-09-30 14:06:18 · 1391 阅读 · 0 评论 -
Linux命令学习手册-readelf命令
readelf elf-file(s) [功能] 用于显示elf格式文件的信息。 [描述] readelf用来显示一个或者多个elf格式的目标文件的信息,可以通过它的选项来控制显示哪些信息。这里的elf-file(s)就表示那些被检查的文件。可以支持32位,64位的elf格式文件,也支持包含elf文件的文档(这里一般指的是使用ar命令将一些转载 2013-09-30 15:06:31 · 747 阅读 · 0 评论 -
程序的链接和加载基础(2)
1.7 符号查找路径 通常在.h文件中声明函数,在.c/.cc文件(静态库/动态库)中定义函数。上面的演示中,在需要函数声明的地方,都是手工声明的。 头文件的查找路径,如果#include "header",那么header在当前路径查找,如果#include ,那么header在/usr/include 和 /usr/local/include 路径查找。转载 2013-09-30 14:54:05 · 713 阅读 · 0 评论 -
Linux下nm和ldd 命令
1. Linux nm 命令nm [‘-a’|‘--debug-syms’] [‘-g’|‘--extern-only’][‘-B’] [‘-C’|‘--demangle’[=style]] [‘-D’|‘--dynamic’][‘-S’|‘--print-size’] [‘-s’|‘--print-armap’][‘-A’|‘-o’|‘--print-file-name’][‘-转载 2013-09-30 16:40:57 · 545 阅读 · 0 评论 -
shell脚本是防止多次运行
#!/bin/bash## file locking using bash.# ver 0.1.6## author : malundao ( malundao@sina.com )# date : 2011-08-31 # ref : http://unix.derkeiler.com/Newsgroups/comp.unix.shell/2005-09/0472.h原创 2013-12-06 10:43:06 · 731 阅读 · 0 评论 -
CMPI中的内存管理及在Open Pegasus 中的实现
本文首先简单介绍了 CMPI(Common Manageability Programming Interface) 规范与 Open Pegasus, 说明了 CMPI 规范中对多线程及内存管理方面的要求,然后以 Open Pegasus 中的实现为例,分析了为实现上述要求所需要的关键数据结构,最后全文进行了总结。CMPI(Common Manageability Programming原创 2012-10-19 22:14:42 · 703 阅读 · 0 评论 -
SAN和NAS的区别
SAN是Storage Area Network的缩写,也就是说SAN是一个网络;NAS是Network Attached Storage的缩写,也就是说NAS是一个存储设备;因此SAN和NAS根本不是同一类东西,因此根本无法将它们进行比较。为什么有许多人要比较SAN和NAS,有以下两种情况:一,他们比较的是服务器是连接到Fabric网络(SAN)还是通过IP(转载 2012-10-19 20:57:29 · 618 阅读 · 0 评论 -
含对象成员类的构造顺序
源程序:#include using namespace std;class A{private: int m;public: A(){ cout ~A(){ cout};class B{private: A a; int n;public: B(){cout ~B(){cout};class转载 2012-10-19 23:07:27 · 834 阅读 · 0 评论 -
排序之逆序数
求数组A[1:n]的逆序对数, 如果iA[j]则(i,j)则称为一个逆序对。数组的逆序对数就是5.求逆序对数最简单的算法就是把数组的元素两两比较下,判断是否逆序对,复杂度为O(n^2).有没有复杂度更低的算法呢?是否可以从排序算法的角度去思考逆序数?排序的过程就是要把逆序的数的次序进行纠正的过程,复杂程度很有可能与逆序对的数量是有关的。1. 逆序对的数量与数组中原创 2012-09-19 22:42:21 · 837 阅读 · 0 评论 -
百度笔试2011
第一题(30分)1.定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素,push和pop的时间复杂度都是O(1),请简要叙述你的思想#include "stdafx.h"#include "stdio.h"#define MAX_SIZE 100class Stack{private: int data[MAX_SIZE ]; int minData[原创 2012-09-21 18:42:14 · 518 阅读 · 0 评论 -
Linux--Linux进程编程小结
进程是正运行于自己的虚拟地址空间的一个具有独立功能的程序,简单地说,进程是程序的一次运行。进程有一定的映像(代码段、数据段和堆栈段),进程是资源的分配单元,进程具有一定的环境。1、进程的结构进程上下文描述进程及其运行环境,它由用户级环境(用户栈的内容、用户地址空间的正文段、数据段)、寄存器环境(硬件寄存器的内容)以及系统级环境(PCB、核心栈的内容、区表和页表)等组成。PCB由两部分数据结原创 2012-09-21 21:27:15 · 469 阅读 · 0 评论 -
epoll例子
令人高兴的是,2.6内核的epoll比其2.5开发版本的/dev/epoll简洁了许多,所以,大部分情况下,强大的东西往往是简单的。唯一有点麻烦是epoll有2种工作方式:LT和ET。LT(level triggered)是缺省的工作方式,并且同时支持block和no-block socket.在这种做法中,内核告诉你一个文件描述符是否就绪了,然后你可以对这个就绪的fd进行IO操作。如果你不作原创 2012-07-02 17:14:09 · 1151 阅读 · 0 评论