编程之美读书笔记
huahuahailang
微信号:huahuahailang
欢迎一起技术交流。
展开
-
3
#include#includeusing namespace std;class CPrefixSorting{public: CPrefixSorting() { m_nCakeCnt=0; m_nMaxwap=0; }private: int m_nCakeCnt;//烙饼个数 int m_nMaxwap;//最多交换次数 int原创 2013-03-23 15:26:58 · 640 阅读 · 0 评论 -
编程之美3.2 电话号码对应英语单词
使用递归方法#includeusing namespace std;char num_char[10][5]={ "","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};int total[10]={0,0,3,3,3,3,3,4,3,4};const int length=3;int number[le原创 2013-09-13 14:51:39 · 983 阅读 · 0 评论 -
编程之美3.8 求二叉树中节点的最大距离
问题定义如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。#include using namespace std;struct NODE{ NODE* pLeft; // 左子树 NODE* pRight; // 右子树 int nMax原创 2013-08-22 11:55:31 · 866 阅读 · 2 评论 -
编程之美——3.1字符串移位包含问题
假设字符串s1=AABCD,s2=CDAA,判断s2是否可以通过S1的循环移位得到字符串包含。 如 s1移两位: 1.ABCDA->2.BCDAA 则此时包含了 S2="CDAA"#include #include #include #include using namespace std;int main(){ string s1="AABCD"; string s2="原创 2013-08-22 08:12:23 · 591 阅读 · 0 评论 -
编程之美2.13 子数组的最大乘积
问题:给定一个长度为N的整数数组,只允许用乘法,不能用除法,计算任意(N-1)个数的组合中乘积最大的一组。 方法一:迭代法s[i]表示数组前i个元素的乘积。s[i]=s[i-1]*array[i-1]t[i]表示数组后(N-i)个元素的乘积。t[i]=t[i+1]*array[i]p[i]表示数组除第i个元素之外,其他N-1个元素的乘积p[i]=s[i-1] * t[i原创 2013-04-21 11:49:32 · 687 阅读 · 0 评论 -
编程之美2.12 快速寻找满足条件的两个数
1. 快速找出一个数组中的两个数,让这两个数之和等于一个给定的值。如:5 6 1 4 7 9 8 sum=102. 快速找出一个数组中的三个数,让这三个数之和等于一个给定的值。如:5 6 1 4 7 9 8 sum=151、解法一:空间换时间,采用hash的方法;扫描数组,找出其中最大值max,申请max长度的空间,例:5,6,1,4,7,9,8max=9;定义数组 n原创 2013-04-21 15:19:57 · 887 阅读 · 0 评论 -
编程之美2.15 子数组之和的最大值(二维)
题目:求二维数组(矩阵)的子矩阵之和的最大值。把问题从二维转化为一维。假设已经确定了矩阵区域的上下边界,不如知道矩阵区域的上下边界分布是第a行和第c行,接下来要确定左右边界。我们把第a行和第c行之间的每一列看成一个整体,相当于一维数组中的一个元素。即求BC[1]、BC[2]、BC[3]、.。。、BC[M]中和最大的一段。BC[i]= B[a][i] + .......+ B[c][i]原创 2013-04-18 17:12:07 · 818 阅读 · 0 评论 -
编程之美 2.14 求数组的子数组之和的最大值
问题:一个由N个整数元素的一维数组,求其所有子数组中连续的元素和的最大值。 算法时间复杂度O(N)使用动态规划的方法,有K个阶段,每个阶段有两种状态。#includeusing namespace std;#define max(a,b) (((a)>=(b))?(a):(b))int main(){ int *A; int i=0; int n,st原创 2013-04-18 22:22:01 · 699 阅读 · 0 评论 -
编程之美2.17 数组循环移位
设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度 O(N)且只允许使用两个附加变量。如K=4,abcd1234 ----------------->>>>>> 1234abcd。如果abcd1234循环右移12位的话,和循环右移4位得到的结果一样。设字符串一共有N位。则 有 k' = k % N ;设abcd234 右移4位,1、逆排序:abcd1234---原创 2013-04-17 14:58:09 · 784 阅读 · 0 评论 -
编程之美 2.16 求数组中最长递增子序列
写一个时间复杂度尽可能低的程序,求一个一维数组N个元素中最长递增子序列的长度.题目: 设L=是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=,其中k1如:序列:1,-1,2,-3,4,-5,6,-7中最长递增子序列的长度为:1,2,4,6 方法一:动态规划:O(N^2)阶段间的关系具有无后效性。阶段:在所有元素的子数组中,选出其中的最长递增原创 2013-04-17 16:49:27 · 1160 阅读 · 0 评论 -
编程之美2.21 只考加法的面试题
题目:我们知道:1+2=3; 4+5=9; 2+3+4=9;等式左边都是两个以上连续的自然数相加,那么是不是所有的整数都可以写成这种形式呢?问题1. 写一个程序,对于一个64位正整数,输出它所有可能的连续自然数(两个以上)之和的算式;问题2. 有的数例如32就找不到这样的表达,这样的数字有什么规律?问题3. 在原创 2013-04-16 15:26:45 · 3934 阅读 · 3 评论 -
编程之美 2.5 寻找最大的K个数
从一组无序的数中寻找最大的K个数。方法一、递归。快排,两个部分,a,b。前一部分长度若>=K,则去前一部分中的前K个,否则后一部分再取K-length(a)个。时间复杂度:O(N*logK)方法二、转化为寻找K个数中最小的那个,即第K大的数。使用二分搜索策略。时间复杂度:O(N)。方法三、使用堆排序。堆有K个元素,堆顶元素是K个元素中最小的。每当来一个数的时候,与堆顶判断,若小于堆原创 2013-04-14 09:29:09 · 751 阅读 · 0 评论 -
编程之美 2.19 区间重合判断
区间重合判断:比如,给出待判断区间[x,y](y>=x)如[1,6],以及目标区间[x1, y1],[x2,y2]....[xi, yi](如[2,3] [1,2] [3, 9]), 判断[1,6]是否在目标区间[2,3] [1,2] [3, 9]中 做法: 先把根据各个目标区间的第一个元素xi排序(可用快排),然后将目标区间中可以合并的区间进行合并,然后 在目标区间的xi中用二原创 2013-04-15 14:09:39 · 892 阅读 · 0 评论 -
编程之美2.11 寻找最近点对
问题:给定平面上N个点的坐标,找出距离最近的两个点。方法1:两两点比较,寻找最近的两个点对,复杂度O(N^2),方法2:1、先对N个点的坐标按照X值排序,递归计算左右两部分的最近点对,分别为MinDist(left)、MinDist(right),计算MDist=min (MinDist(left),MinDist(right))2、找出带状区域。如果一个点对的距离小于MD原创 2013-04-22 15:26:18 · 1129 阅读 · 0 评论 -
编程之美 1.1、CPU占用率
Windows API :Sleep();让线程停下来GetTickCount();获取当前系统时间PerformanceCounter();效能计数器GetCPUTickCount();获取CPU核心运行周期数GetProcessorInfo()/SetThreadAffinityMask();多核问题,控制CPUtimeGetSystemTime();获取高精度时间原创 2013-03-23 09:54:31 · 725 阅读 · 0 评论 -
编程之美 2.18数组分割问题
问题:1. 有一个无序、元素个数为2n的正整数数组,要求:如何能把这个数组分割为元素个数为n的两个数组,并使两个子数组之和最接近。采用动态规划的方法来解决问题。题目转化为:从2n个数中选出任意个数,其和尽量接近于给定值sum/2。外阶段:在前k个数中进行选择,k=1,2...2*n。内阶段:从这k个数中任意选出i个数,i=1,2...k1。状态:这i个数的和为v,v=1,2原创 2013-04-09 16:26:22 · 943 阅读 · 0 评论 -
编程之美 1.2 象棋将帅问题
列出所有的可能组合: 1将 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9帅下面原创 2013-03-23 14:01:58 · 611 阅读 · 0 评论 -
编程之美2.10 寻找数组中的最大值和最小值
对于一个由N个整数组成的数组,需要比较多少次才能把最大和最小的数找出来呢例如给出如下数组:5 ,6,8,3,7,9 max=9 min=3解法一:扫描一遍数组,比较2*N次求解。解法二:分治法,分别在前后N/2个数中求Min、Max,然后将前后的Max 、Min比较即可。f(2)=1f(N)=2*f(N/2)+2=2^2*f(N/(2^2))+4+2=....原创 2013-04-22 21:15:23 · 763 阅读 · 0 评论