算法
zhanglei_1991
野生程序猿一只
展开
-
剑指Offer —— 找出数组中两个只出现了一次的数字
主要思路是:通过异或操作,消除数组中相同的两个数,结果等于不同的两个数的异或,然后找到异或结果中从右往左第一个是1的是第n位,将数组按照第n位是否为1分为两组,分别组内异或,异或的结果几位只出现了一次的那个数。vs2015中调试运行通过#include "stdafx.h"#includeusing namespace std;unsigned int FindFi原创 2016-04-07 11:17:28 · 254 阅读 · 0 评论 -
剑指Offer——不能被继承的类
主要思路:1.把构造函数设为私有函数,通过类的静态函数来调用构造函数,生成新的实例,缺点是只能得到堆上的实例,得不到栈上的实例2.虚拟继承于一个基类,并把自己设为该基类的友元。此类生成实例时,会先调用基类的构造函数,虽然基类构造函数是私有的,但是作为基类的友元函数依然可以调用。如果此类被继承,生成实例时先调用该类的构造函数,由于该类是虚拟继承会先调用基类的构造函数,但基类的构造函数是私有的原创 2016-04-08 14:11:54 · 343 阅读 · 0 评论 -
剑指offer——字符串转数字
主要思想:一定要注意各种边界条件,考虑各种错误输入和数据溢出以下代码在vs2015中调试运行无误#include "stdafx.h"#includeusing namespace std;enum Statues { kInvalid = 0, kValid };int g_nStatus = kValid;long long StrToIntCore(cons原创 2016-04-08 16:06:39 · 322 阅读 · 0 评论 -
剑指Offer——重建二叉树
主要思路:利用递归把前序遍历的第一个节点存入根节点,然后递归处理左右子树以下代码在牛客网的OJ中调试运行无误/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x)原创 2016-04-25 10:46:21 · 354 阅读 · 0 评论 -
九大排序算法-c语言实现及详解
概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。我们这里说说八大排序就是内部排序。 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待转载 2016-04-25 14:49:27 · 922 阅读 · 0 评论 -
剑指Offer——构建数组B[i]=A[0]*A[1]*....A[i-1]*A[i+1]*A[i+2]*...A[n-1],不能使用除法
主要思路:定义C[i] = A[0]*A[1]*....A[i-1],自上而下求C[i] , C[i] = C[i-1] *A[i-1]定义D[i] = A[i+1]*A[i+2]*...A[n-1] ,自下而上求D[i], D[i] = D[i+1] *A[i+1]void multiply (const vector& array1, vector & array2)原创 2016-04-08 21:55:35 · 1000 阅读 · 0 评论 -
剑指Offer——n个0到n-1的数里重复的数字
主要思路:一般:排序后查找;常用:构造哈希表;最优:交换查重;以下代码为交换查重的代码,在vs2015中调试运行无误。#include "stdafx.h"#includeusing namespace std;bool duplicate(int data[],int length, int &duplication){ if(NULL == data |原创 2016-04-08 20:36:10 · 810 阅读 · 0 评论 -
剑指Offer——单例模式C++实现
原文地址:http://www.jellythink.com/archives/82问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中,会专门有一个日志模块,负责写日志,由于在系统的任何地方,我们都有可能要调用日志模块中的函数,进行写日志。那么,如何构造一个日志模块的实例呢?难道,每次new一个日志模块实例,写完日志,再d转载 2016-04-11 16:19:02 · 462 阅读 · 0 评论 -
剑指Offer——二维数组查找
主要思路:利用矩阵右上角的数字做判断,如果要查找的数大于该数,则去除对该行的判断,如果要查找的数小于该数,则去除对该列的查找以下代码在vs2015中调试运行通过#include "stdafx.h"#include #includeusing namespace std;class Solution {public: bool Find(vector> array, int t原创 2016-04-21 12:17:33 · 297 阅读 · 0 评论 -
求 1!+2!+3!....+n! 的 C++递归与非递归实现
本来很简单的一道题,笔试的时候就是脑袋僵掉了,居然传参的时候搞错了。下面是正确的代码#include "stdafx.h"#includeusing namespace std;//递归函数long long func(long long data, long long &sum){ if (data == 1) return 1; long long temp =原创 2016-09-14 21:52:01 · 5210 阅读 · 0 评论 -
7种排序算法的C++实现
以下代码在vs2010环境下调试运行无误,算法简要解析见注释// sort.cpp : 定义控制台应用程序的入口点。////由小到大排序#include "stdafx.h"#includeusing namespace std;#define NUM 10 //数组大小void swap(int * a,int *b){ int temp = *a; *a = *b;原创 2016-08-24 22:49:44 · 510 阅读 · 0 评论 -
单链表快速排序
单链表的特点是:单向。设头结点位head,则最后一个节点的next指向NULL。如果只知道头结点head,请问怎么将该链表排序? 那么一般人见到这种题目,立马就会想到指针交换。是的,大家被指针交换的题目做多了,形成思维定势了。对于这道题,我们完全可以利用值交换来达到排序的目的。当然,怎么值交换? 很多人得第一想法就是选择排序,这个木有问题,原创 2016-09-03 18:02:48 · 508 阅读 · 0 评论 -
华为机试题——购物清单(01背包问题)
题目描述王强今天很开心,公司发给N元的年终奖。王强决定把年终奖用于购物,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:主件附件电脑打印机,扫描仪书柜图书书桌台灯,文具工作椅无如果要买归类为附件原创 2016-09-18 11:21:24 · 2258 阅读 · 0 评论 -
华为机试题——识别有效的IP地址和掩码并进行分类统计
题目描述请解析IP地址和对应的掩码,进行分类识别。要求按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类。所有的IP地址划分为 A,B,C,D,E五类A类地址1.0.0.0~126.255.255.255;B类地址128.0.0.0~191.255.255.255;C类地址192.0.0.0~22原创 2016-09-18 20:33:49 · 1780 阅读 · 0 评论 -
剑指Offer——不用加减乘除求两个整数之和 + 不使用新的变量交换变量a,b
1.求和主要思路利用异或 和移位操作实现2.交换主要思路 ①:基于加减法 a = a+b; b = a-b; a = a-b;② :基于异或运算 a = a^b; b = a^b; a = a^b;以下为求和的代码,在VS2015中调试运行无误#i原创 2016-04-08 13:49:30 · 535 阅读 · 0 评论 -
剑指Offer——不使用循环,判断,选择语句实现1+2+3....+n
主要思路:1.使用类的构造函数求解2.使用虚函数求解3.使用函数指针求解4.使用模板类型求解/*******************1.利用构造函数求解***********************/class Temp{public : Temp() { ++N; Sum += N; } static void Reset() { N =原创 2016-04-08 13:24:55 · 379 阅读 · 0 评论 -
剑指Offer——查找递增数组中和为S的两个数
主要思路为:定义两个指针一个指向头一个指向尾,在while循环里求头尾和,如果等于S则输出,大于S头指针--,小于S尾指针++。程序在vs2015中调试运行无误#include "stdafx.h"#includeusing namespace std;bool FindTheTwoNum(int data[], int len, int *num1, int *nu原创 2016-04-07 11:59:34 · 394 阅读 · 0 评论 -
剑指Offer——输入正整数S,打印出所有和为S的连续正数序列(至少含有两个正数)
主要思路:定义两个数从1,2开始增长,求这两个数之间所有数的和,如果等于S则打印输出,如果大于则让小的数增长,否则让大的数增长,增长后重现判断和是否等于S,在循环中执行直到小的数大于等于(1+S)/2。用到了一个小小的技巧,就是求两个数中间的数之和时,保存了上一次的值,新的值只需要减去小的数,或者加上大的数即可。以下代码在VS2015中调试通过:#include "stdafx原创 2016-04-07 14:16:52 · 821 阅读 · 0 评论 -
剑指Offer——翻转英文句子中的单词顺序
主要思路:先交换整个句子的顺序,再交换每个单词的顺序。一下代码在VS2015中调试无误#include "stdafx.h"#includeusing namespace std;void Reverse(char *pBegin, char *pEnd){ if (NULL == pBegin || NULL == pEnd) return; while (原创 2016-04-07 15:20:35 · 469 阅读 · 0 评论 -
剑指Offer——把字符串前面的n个字符转移到字符串的尾部
主要思路:和前面逆转单词顺序方法差不多,甚至更简单,只需要调用三次逆转字符串的函数即可。先分别逆转两部分,再逆转整个字符串。以下代码在VS2015中调试运行无误#include "stdafx.h"#includeusing namespace std;void Reverse(char *pBegin, char *pEnd){ if (NULL == pBegin ||原创 2016-04-07 15:50:26 · 693 阅读 · 0 评论 -
五大常用算法:分治、动态规划、贪心、回溯、分支限界算法
(可参考 http://c.chinaitlab.com/special/algorithm/Index.html)五大常用算法之一:分治算法分治算法一、基本概念 在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的转载 2016-04-07 17:22:01 · 866 阅读 · 0 评论 -
哈希表及哈希表查找相关概念
原文地址:http://www.cnblogs.com/Bob-FD/archive/2012/10/16/2725916.html1. 哈希表的概念 对于动态查找表而言,1) 表长不确定;2)在设计查找表时,只知道关键字所属范围,而不知道确切的关键字。因此,一般情况需建立一个函数关系,以f(key)作为关键字为key的录在表中的位置,通常称这个函数f(key)为哈希函数。(注意:这个转载 2016-04-07 17:27:08 · 460 阅读 · 0 评论 -
B 树、B+ 树、B* 树
原文地址:http://www.cnblogs.com/Bob-FD/archive/2012/06/20/2556505.htmlB 树、B+ 树、B* 树 作者:July、weedge、Frankie。编程艺术室出品。说明:本文从B树开始谈起,然后论述B+树、B*树,最后谈到R 树。其中B树、B+树及B*树部分由weedge完成,R 树部分由Frankie完成,全文最终转载 2016-04-07 17:28:42 · 301 阅读 · 0 评论 -
剑指Offer——n个骰子扔出点数和S的概率
原文节选自《剑指Offer》题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,打印出S的所有可能的值出现的概率。分析:玩过麻将的都知道,骰子一共6个面,每个面上都有一个点数,对应的数字是1到6之间的一个数字。所以,n个骰子的点数和的最小值为n,最大值为6n。因此,一个直观的思路就是定义一个长度为6n-n的数组,和为S的点数出现的次数保存到数组第S-n个元素里。另外,我们转载 2016-04-07 17:41:48 · 2505 阅读 · 0 评论 -
剑指Offer——从扑克中抽五张牌,判断是否是连续的五张
主要思路:把大小王视为0,先排序,排完之后,统计其中0的个数,和排序后每两个数之间间隔的和,比较和与0的个数,如果相等则认为是连续的(大小王可视为任何一张牌),所以间隔减去大小王的数就等于,无法连续的间隔数以下代码在vs2015中调试运行无误#include "stdafx.h"#includeusing namespace std;int compare(const原创 2016-04-08 10:00:19 · 1778 阅读 · 0 评论 -
剑指Offer——约瑟夫环,0,1,...n-1围成的环,从0开始每次删除第m个,求最后剩余的一个数字
主要思路:1.利用list容器循环,循环过程中判断一旦到达容器尾就将迭代器指向容器头2.利用递推关系f(n,m) = { 0 n=1 { [f(n-1,m)+] % n n>1 具体类推过程见剑指Offer面试题45一下代码在vs2015中调试运行无误#include原创 2016-04-08 11:26:22 · 597 阅读 · 0 评论 -
剑指Offer——快速排序
主要思路:分治法,挑选出来一个中间数,将大于中间数和小于中间数的分成两组,然后组内排序,递归处理以下代码在vs2015中调试运行无误#include "stdafx.h"#includeusing namespace std;#includeint RandomInRange(int start, int end){ if (end>start) { sr原创 2016-04-12 15:06:29 · 420 阅读 · 0 评论 -
华为机试题——简单错误记录
题目描述开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。 处理: 1、 记录最多8条错误记录,循环记录,对相同的错误记录(净文件名称和行号完全匹配)只记录一条,错误计数增加; 2、 超过16个字符的文件名称,只记录文件的最后有效16个字符; 3、 输入的文件可能带路径,记录文件名称不能带路径。原创 2016-09-18 22:18:01 · 733 阅读 · 0 评论