51CTO博客开发会飞de树
题目:1到N的数字,在中间增加‘+’、‘-’、‘ ’,使算术式值为零。 例如:N=7,1-23-45+67=0; 思路: N个数之间需要加入N-1个符号,每个符号有三种可能,进行穷举,计算算式的结果,结果为零的话输出,符号确定后要先去掉空格,得到实际参加运算的数字。 char s[20]/*除
题目:一个字符串只有‘R’、‘G’、‘B’组成,如何让所有的‘R’出现在前面,所有的‘G’在中间,所有的‘B’在最后。 要求:要求空间复杂度为O(1),只许遍历一遍字符串数组 思路:维护三个游标 i、j、k i 指向开始, j 指向尾部,用于分别插入
对于是值传递还是地址传递不能通过行参来判断,当形参是指针时既有可能是值传递也有可能是地址传递,要画图分析,几个例子如下 void Exchg1(int x, int y) { int tmp; &nb
约瑟夫环问题是比较经典的问题,原来做的题目是依次输出数字,而原来的循环链表结构不改变,今天遇到一道题是要求按照顺序重新组成一个循环单链表。 题目:一些人围坐一圈报数,形成一个循环单链表,当报数是m或m的倍数时出将节点从单链表中删除,重新加入新的循环单链表,最后形成一个新的循环单链表。 struct Node { &nbs
输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。 这道题不难,可以利用归并排序的一部分来做,但由于是链表形式的,细节很容易出错。 非递归的方法很容易想到: struct Node { int num;
//Singleton.h #ifndef _SINGLETON_H_ #define _SINGLETON_H_ #include <iostream> #include <pthread.h> using namespace std;
最近要把C/C++编程的一个程序转到网页上,这就需要用到html和php,但以前没有接触过,所以碰壁很多,把遇到的一些问题写下来,以便其他人遇到的话作为参考。 1、首先是环境的搭建:在window xp系统下 Apache+PHP+MySQL 我是完全按照《零基础学PHP》这本书的步骤来进行搭建的,没有遇到问题。 编辑器装的是Zend Studio 2、新建工程 可以通过新建一个简单的
因为栈stack的遍历只能逐个pop,很麻烦,并且破坏了原来的栈,所以可以用deque来模拟栈。 #include "stdafx.h" #include <iostream> #include <deque> #include <vector> &
用带头结点的单链表 设两个工作指针p和q,分别指向两个单链表的开始节点,两个多项式求和的实质上是对结点p的指数域和结点q的指数域进行比较。 (1)若p->exp<q->exp,则结点p应为结果中的一个结点,将指针p后移。 (2)若p->exp>q->exp,则结点q应为结果中的一个结点,将q插入到第一个单链表结点p之前,再将指针q后移。 (3)若p-&g
今天看到一道面试题, 一个最小堆,也是完全二叉树,用按层遍历数组表示。 1. 求节点a[n]的子节点的访问方式 2. 插入一节点的程序void add_element(int *a,int size,int val); 3. 删除最小节点的程序。 刚看到的时候觉得挺难的,没有什么思路,原因在于对最小堆的完全二叉
如果将五笔的编码按字典序排序,形成数组如下:a, aa, aaa, aaaa, aaab, aaac, ..., b, ba, baa, baaa, baab...yyyx, yyyy 其中a的索引是0,aa的索引是1,aaa的索引是2,aaaa的索引是3,以此类推: 1)、编写一个函数,输入是任意一个合法的字符串,输出这个字符串对应的索引; 2)、编写一个函数,输入是任意一个合法的索引,输
数字的全排列常见的是递归的方法。 #include "stdafx.h" #include <iostream> using namespace std; int n = 0; void&
转自http://s.sousb.com/2011/04/15/%E7%BC%96%E7%A8%8B%E4%B9%8B%E7%BE%8E-%E6%9C%80%E7%9F%AD%E6%91%98%E8%A6%81/ Alibaba笔试题:给定一段产品的英文描述,包含M个英文字母,每个英文单词以空格分隔,无其他标点符号;再给定N个英文单词关键字,请说明思路并编程实现方法String extractS
题目:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。 解法:字符串分成X和Y两部分XY,首先对X和Y两段分别进行翻转操作,这样就能得到XTYT。接着再对XTYT进行翻转操作,得到(XTYT)T=(YT)T(XT)T=YX
子字符串和子串是有区别的,字符串要求是连续的,而子串则不用连续。 求最长公共子字符串的问题也可以用类似于求最长公共子串中矩阵递推的方法,但是需要注意的是,当两个字符串中某个位置字符不同时,需要将相应矩阵位置设为0. 定义f(m, n)为Xm和Yn之间最长的子字符串的长度并且该子字符串结束于Xm & Yn。因为要求是连续的,所以定义f的时候多了一个要求字符串结束于Xm & Yn
题目:如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子串。注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中。请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。 例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子串,则输出它们的长度4,并打印任意一个子串 这道题用动
题目:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。链表结点定义如下: struct ListNode { int m_nKey;ListNode* m_pNext; }; 分析:通常在单链表的首元结点(存放第一个数据元素的结点)之前附设一个头结点(数据域什么都不放),称之为带头结点的单链表,反之就是不带头结点的单链表。如果是带头结点的链表反转后头结点应该还放在最开始。 带头
在C++ STL中有双向队列deque,当单向的来用就行,设有两个队列A和B,栈的push操作,直接push到A的队尾就行了。栈的pop操作时,将A中的队列依次取出放到B中,取到最后一个时,最后一个不要放到B中,直接删掉,再将B中的值依次放回A中。栈的top操作时,将A中的队列依次取出放到B中,取到最后一个时,将最后一个值记录下来,再将最后一个值放到B中,再将B中的值依次放回到A中。 #incl
有环单链表需要解决的问题: 1、如何判断有环没有环? 使用追赶的方法,设定两个指针slow、fast,从头指针开始,每次分别前进1步、2步。如存在环,则两者相遇;如不存在环,fast遇到NULL退出。 2、如何判断环的长度? 记录下问题1的碰撞点p,slow、fast从该点开始,再次碰撞slow所走过的操作数就是环的长度s 3、如何找到环的连接点在哪里? 有定理:碰撞点p到连接点的距离
题目:用两个栈实现队列 思路:假设两个栈A和B且都为空,可以认为A提供入队列的功能,B提供出队列的功能。入队列:入栈A。出队列:如果B不为空,则直接弹出栈B的数据,如果栈B为空,则依次弹出栈A的数据,放到栈B中,再弹出栈B的数据。 #include<stdafx.h> #include<iostream> #include&nbs
题目:输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串"345",则输出整数345。 分析:这道题看起来不难,但考虑全面了也不容易,需要考虑一些特殊情况 1、输入的字符指针为空 2、出现了非数字的字符 3、输入的字符转换为数字后超过int表示的最大数 4、输入的字符中数字前面有正负号 // ab.cpp :&n
卡特兰数:规定h(0)=1,而h(1)=1,h(2)=2,h(3)=5,h(4)=14,h(5)=42,h(6)=132,h(7)=429,h(8)=1430,h(9)=4862,h(10)=16796,h(11)=58786,h(12)=208012,h(13)=742900,h(14)=2674440,h(15)=9694845····&
#include<stdio.h> #include <iostream> using namespace std; void GetMemory1(char *p) { &nb
题目:下面是一个数组类的声明与实现。请分析这个类有什么问题,并针对存在的问题提出几种解决方案。 #include<stdio.h> #include <iostream> using namespace std; template<typename T&
一般的常量在一个文件中定义后,在另外一个引用到这个变量的文件中在变量声明前加上extern即可,但是如果是常量,则需要在定义的地方也要加上extern,例如: // ab.cpp : 定义控制台应用程序的入口点。 #include "stdafx.h" #include<stdio.h> extern const int m=10; void main()
题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字。求出在这个圆圈中剩下的最后一个数字。 题意理解:最开始时,0报数1,则如果m小于n,第m个数字实际上是m-1,删除掉一个数字以后,被删除的数字的下一个数字报数1,例如n=10,
题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。 思路1:利用C++ STL的hash_map来统计每个字符出现的次数,维护一个Key为Query字串,Value为该Query出现次数的HashTable,即 Hashmap(Query,Value),每次读取一个Query,如果该字串不在Table中,那么加入该字串,并且将Value值设为1;如果该
题目:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。 例如输入 思路:我们从树的根结点开始分析。自然先应该打印根结点8,同时为了下次能够打印8的两个子结点,我们应该在遍历到8时把子结点6和10保存到一个数据容器中。现在数据容器中就有两个元素6 和10了。按照从左往右的要求,我们先取出6访问。打印6的同时要把6的两个子结点5和7放入数据容器中,此时数据容器中有
本人没有参加这次笔试,从网上看到的两道题 第一题: 问题描述:两个数组a[N],b[N],其中A[N]的各个元素值已知,现给b[i]赋值,b[i] = a[0]*a[1]*a[2]...*a[N-1]/a[i]; 要求: 1.不准用除法运算2.除了循环计数值,a[N],b[N]外,不准再用其他任何变量(包括局部变量,全局变量等)3.满足时间复杂度O(n),空间复杂度O(1) 可以依次将b
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号