
面试
fjqcyq2
这个作者很懒,什么都没留下…
展开
-
01背包问题
01背包问题是一个经典 的动态规划的问题,现在再拿出来分享一下。具体的,背包问题一个例子来说就是:现在假设你有个背包,容量是只能装下重量为V=10kg的物品,现在桌子上有若干物品,但是不能把物品拆开拿走。假设现在有四种物品,wt={5,4,6,3}kg, 价值分别是val={10,40,30,50}。问题是在背包容量一定的情况下,应该如何拿物品,使得背包中的物品的总价值最大。那么该如何求解原创 2015-04-05 10:11:01 · 566 阅读 · 0 评论 -
KMP小计
KMP之前一直困扰了好久,说抽时间搞明白也是一直没时间,现在有点明白,但又时间太紧,所以仅记个大概来,方便我自己以后回顾。KMP之所以效率比较高,是因为模式串中有重复的元素。设S为主串,则要匹配的模式串就是T串。也就是说T串中有重复的元素,比如: T = “abababc” 可以看出abababc中有重复的串,即前四位abab与从第2-5位的串是一样的(从0开始) 则根据其他参考资料,T的nex原创 2015-08-12 15:27:35 · 383 阅读 · 0 评论 -
丑数
题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第1500个丑数 暴力求解方法虽然简单,但是时间复杂度太高。剑指offer上有如下代码:int ThreeMin(int a, int b, int c){ int result = a<b?a:b; resu原创 2015-10-06 15:58:25 · 445 阅读 · 0 评论 -
C++ static、const和static const 以及它们的初始化
const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间。 static表示的是静态的。类的静态成员函数、静态成员变量是和类相关的,而不是和类的具体对象相关的。即使没有具体对象,也能调用类的静态成员函数和成员变量。一般类的静态函数几乎就是一个全局函数,只不过它的作用域限于包含它的文件中。 在C++中,static静态转载 2015-10-03 22:13:46 · 360 阅读 · 0 评论 -
旋转有序数组的二分查找
总结规律,简化模型 题目都不难,重要的是很敏锐的发现问题的规律。旋转有序数组的二分搜索,如 int arr[N] = {15,16,19,20,25,1,3,4,5,7,10,14}; 查找X = 5 主要思想: 每次根据L和R求出M后,M左边[L, M]和右边[M+1, R]这两部分中至少一个是有序的。 arr[M]和X比较 (1). arr[M]==X,返回M (2). arr[转载 2015-10-03 19:11:36 · 768 阅读 · 0 评论 -
宏定义(const)和常量定义(#define)的区别
宏定义(const)和常量定义(#define)的区别(转载)1.效果-《高质量C++/C编程指南》C++ 语言可以用const 来定义常量,也可以用#define 来定义常量。但是前者比后者有更多的优点: (1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。 (转载 2015-07-27 18:47:36 · 605 阅读 · 0 评论 -
如何限制对象只能建立在堆上或者栈上
在C++中,类的对象建立分为两种,一种是静态建立,如A a;另一种是动态建立,如A* ptr=new A;这两种方式是有区别的。 静态建立一个类对象,是由编译器为对象在栈空间中分配内存,是通过直接移动栈顶指针,挪出适当的空间,然后在这片内存空间上调用构造函数形成一个栈对象。使用这种方法,直接调用类的构造函数。 动态建立类对象,是使用new运算符将对象建立在堆空间中。这个过程分为两步,第一转载 2015-10-03 20:28:40 · 668 阅读 · 0 评论 -
不用加号实现加法!
有一个题目说的是如何不用加号来实现加法运算,看到了一个大牛的代码,顿时膜拜!废话不说,上思路。比如,int a =7, int b=8; 如何不用加号来计算a+b?代码如下:int Add(int a, int b){char *c = (char *)a;return (int) &c[b];}就是这么简单的两句代码。具体的意思就是:1、首先将a转换为地址类型,即a=7,原创 2015-04-24 21:08:53 · 8352 阅读 · 1 评论 -
最长重复子串与最长重复子序列
仅为自己做个记录,仅供参考原创 2015-09-02 21:03:03 · 1408 阅读 · 0 评论 -
最长不下降子序列的O(n)算法
最长不下降子序列(LIS:Longest Increasing Subsequence) 问题描述:给出n个数,求出其最长不下降子序列的长度,比如n=5,5个数是{4,6,5,7,3};其最长下降子序列就是{4,6,7},长度为3。 看了好多网上的算法一般的都是O(N^2), 最好的是O(NLogN). 我想到一个能在O(N)的时间内解决这个问题。 具体方案如下: 该问题可以转换为剑指off原创 2015-09-02 20:00:39 · 2287 阅读 · 2 评论 -
求字符串中最长无重复字符的子串
题目:求一个字符串中最长的没有重复字符的子串。 例如字符串“abcdaefgh” 使用hash表记录是否之前的字符出现,具体代码如下://O(N^2)的时间复杂度int max_unique_substring2(char * str) { int i,j; int begin; int maxlen = 0; int hash[256]; int n转载 2015-09-01 10:28:04 · 623 阅读 · 0 评论 -
给定一个奇数n,比如n=3,生成1到n平方的数,如1到9,填入九宫格,使得横竖斜的和都相等。
给定一个奇数n,比如n=3,生成1到n平方的数,如1到9,填入九宫格,使得横竖斜的和都相等。如题,给定一个奇数n,然后填充n*n的矩阵方格,使得矩阵中的每行、每列、斜对角线的和均相等。并且填的数字都不同,且正好为[1, n*n]之间的整数。 该题的大致思路是这样的: 以n等于3为例,首先将第0行第1列填充为1,然后向右向上逐渐递增填写数字。具体代码如下:void nineGongGe( int原创 2015-08-17 09:51:39 · 4589 阅读 · 0 评论 -
字符串全排列
字符串全排列问题:给定字符串S,生成该字符串的全排列。方法:依次从字符串中取出一个字符作为最终排列的第一个字符,对剩余字符组成的字符串生成全排列,最终结果为取出的字符和剩余子串全排列的组合:#include <iostream>#include <string>using namespace std;void permute(string prefix, string str){ if原创 2015-08-29 12:02:08 · 666 阅读 · 0 评论 -
数组中只出现一次的数字
数组中只出现一次的数字题目:一个整形数组中除了两个数字之外,其他的数字都出现了两次。请写程序找出只出现一次的数字。要求时间复杂度O(n),空间复杂度O(1)。 - 思路: 原来有个题目是所有的数字都是两个,只有一个数字只出现了一次。而这个题目的思路就很容易了,让数组中的每个数字进行异或。异或能够满足交换律,并且a^a = 0, 0^a = a, 所以,很明显所有成对相同的数字经过异或之后都变成原创 2015-07-23 10:30:09 · 1304 阅读 · 0 评论 -
大数乘法
大数乘法 一般来说涉及到大数的,都会先将其转换为字符串,然后根据进行对应的字符串运算,最后再将结果输出。#include<iostream>#include<string>using namespace std;int bigMultiply();int main(){ char str1[1000],str2[1000]; int i,j,len1,len2,len;原创 2015-08-12 19:33:29 · 920 阅读 · 0 评论 -
最长重复子串,最长公共子序列, 最长公共子串
最长重复子串,最长公共子序列, 最长公共子串原题:首先这是一个单字符串问题。子字符串R 在字符串L 中至少出现两次,则称R 是L 的重复子串。重复子串又分为可重叠重复子串和不可重叠重复子串,这里只是简单讨论最长可重叠的重复子串,给出基本算法。最长重复子串 用最笨的方法,逐个扫描,时间复杂度O(N^2), 代码如下,亲测可用:int LCS::comLen(const char*p, const c原创 2015-08-11 20:26:33 · 1173 阅读 · 0 评论 -
稳定排序和不稳定排序(转载)
稳定排序和不稳定排序(转载)首先,排序算法的稳定性大家应该都知道,通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。在简单形式化一下,如果Ai = Aj, Ai原来在位置前,排序后Ai还是要在Aj位置前。 其次,说一下稳定性的好处。排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用。基数排序就 是这样转载 2015-07-27 16:21:42 · 346 阅读 · 0 评论 -
斐波那契数列的各种算法实现
斐波那契数列,但凡学过编程的童鞋们应该都懂,背景就不介绍了(就是大兔子生小兔子的故事),无论是面试还是实际的运用,常见的一个思路就是先用最先基本的办法实现,然后根据实际要求,一步步改进,优化算法效率。今天就以斐波那契数列这个大家都很熟悉的为例来小小感受一下。Version 1long Fibonacci(int n) { if (n == 0) return 0;转载 2015-05-27 22:50:08 · 647 阅读 · 0 评论 -
Magic Index 分析
给定一个数组A,其中有一个位置被称为Magic Index,含义是:如果i是Magic Index,则A[i] = i。假设A中的元素递增有序、且不重复,请给出方法,找到这个Magic Index。更进一步,当A中允许有重复的元素,该怎么办呢?没有重复元素的情况一些同学在遇到这个题目的时候,往往会觉得比较简单。扫描一遍,不就ok了么?O(n)的。很简单呀。可是,大家要注意到,还有一个条件没有用:A中转载 2015-10-06 14:52:27 · 670 阅读 · 0 评论