09 2012 档案
摘要:字符串乘法,有两个字符串表示的正数a、b,求乘积c,也用字符串表示。涉及字符串乘法、字符串加法。 class Solution { private: char mul(char a, char b, char &carry) { int val = (a - '0') * (b - '0') + (carry...
阅读全文
摘要:就是合并两个有序链表了,递归解妥妥儿的。 ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) { if (l1 == NULL) return l2; if (l2 == NULL) return l1; ListNode *ret = NULL; ...
阅读全文
摘要:××公司面试题,看了后没想法,后搜一下发现居然是高中奥数。真无语了,这年头面试官都想干啥呢?!尼玛,这题你自己会做不啊?!平面上n个圆,任意两个都相交,是否有一条直线和所有的圆都有交点。
阅读全文
摘要:神马是离散化:http://www.matrix67.com/blog/archives/108 例题:POJ 1151 Atlantis #include <iostream> #include <vector> #include <set> #include <algorithm> #include <iomanip> using n...
阅读全文
摘要:昨天面了一家对算法、数学要求比较高的公司。然后遇到了个经典概率题,没做出来。工程中基本没用到过的东西却拿来面试,很郁闷。为了搞定面试还是要把漏洞给补上。 用赌博解投硬币问题:http://www.matrix67.com/blog/archives/3638 投硬币问题的复杂分析:http://www.cnblogs.com/atyuwen/archive/2010/09/1...
阅读全文
摘要:向量的叉积性质都忘完了……但是它可以用来判断点在直线的某侧。进而可以解决点是否在三角形内,两个矩形是否重叠等问题。向量的叉积的模表示这两个向量围成的平行四边形的面积。 设矢量P = ( x1, y1 ),Q = ( x2, y2 ),则矢量叉积定义为由(0,0)、p1、p2和p1+p2所组成的平行四边形的带符号的面积,即:P×Q = x1*y2 - x2*y1,其结果是一个伪矢...
阅读全文
摘要:N条直线最多将平面划分为多少区域,如果换成折线,又是多少? 由上图可知: 两条直线最多一个交点,将平面分成了4个区域; 三条直线最多三个交点,将平面分成了7个区域; 可以推出: 每增加一条直线,如果增加m个交点,那么这条直线被新增加的m个交点,分成(m+1)段。每一段又会将原来的一个区域分成两块,因此,新增加了(m+1)个新区域。增加第N+1条...
阅读全文
摘要:题意是生成N位长的格雷码。格雷码是一种二进制的数值表示方法,两个连续值只有1位不同。例如,输入n=2,返回[0, 1, 3, 2]。对应的格雷码是这样的: 00 - 001 - 111 - 310 – 2 vector<int> grayCode(int n) { vector<int> vecRet; stack<int> s; ...
阅读全文
摘要:昨儿晚去笔了家公司,然后看到一个环链表转单链表的题。题是这样的,有个环链表,依次把第m个节点删除环链表(约瑟夫环操作)。最后根据节点删除顺序重建为单向链表,并返回。 void reorder(node **head, int m) { // Check param. if (head == NULL || *head == NULL ||...
阅读全文
摘要:这个最简单了,就是用一个最大值栈和一个最小值栈来维护最值信息。 template<typename T> class stack_ext : public stack<T> { public: void push(const typename stack<T>::value_type &t) { if (...
阅读全文
摘要:实现一个最值队列,要求取最大值、最小值的时间复杂度为O(1)。以前实现最值栈比较多,又因为一个队列可以用两个栈实现,所以最传统的做法是用最值栈实现最值队列。这里用deque实现最值队列,简单高效。 template<typename T> class queue_ext : public queue<T> { public: void pu...
阅读全文
摘要:哎,程序员面试就是伤神。各种奇葩的题都有,猜扑克牌算是个经典老题了。收藏一下,方便日后查看。 S先生、P先生、Q先生他们知道桌子的抽屉里有16张扑克牌:红桃A、Q、4 黑桃J、8、4、2、7、3 草花K、Q、5、4、6 方块A、5。约翰教授从这16张牌中挑出一张牌来,并把这张牌的点数告诉 P先生,把这张牌的花色告诉Q先生。这时,约翰教授问P先生和Q 先生:你们能从已知的点数或花色...
阅读全文
摘要:题意是要求生成匹配的括号结果。假如给定n = 3,需要生成3对括号的有效组合,即"((()))", "(()())", "(())()", "()(())", "()()()"。 void unguarded_generate(vector<string> &result, string curr, int m, int n) { if (m == 0...
阅读全文
摘要:题意是给一个未排序的数组,可能包含正数、负数、0。求第一个未出现的正数,例如[1, 2, 0],由于第一个未出现的正数是3,返回3;[3, 4, -1, 1]第一个未出现的正数是2,返回2。算法要求O(n)时间复杂度及常数空间复杂度。 // Stable unguarded_partition, always put t to the left side. // I...
阅读全文
摘要:题意是求俩字符串的编辑距离,编辑定义有三种1、插入字符 2、删除字符 3、替换字符。 int minDistance(string word1, string word2) { if (word1.size() == 0) return (int)word2.size(); if (word2.size() == 0) return (...
阅读全文
摘要:题意是计算a/b,其中a、b均为int,结果也要int。但是计算不允许使用乘法、除法、取模运算。 class Solution { public: // Divide two unsigned int once, using binary divide method. unsigned int unsigned_divide_on...
阅读全文
摘要:题意是1-26对应于A-Z,这样一个数字字符串可以解码成只包含A-Z的字符串。例如,12可以解码成AB,也可以解码成L。这样12就有两种解码方式。实现numDecodings(string s)接受数字字符串,返回可以解码的方式数。 int check(char one) { return (one != '0') ? 1 : 0; } ...
阅读全文
摘要:You can do this with the set of features introduced in Windows Phone 7.1 SDK (Mango). Following features will enable you to develop this application: 1- Background agents: You will need to run a piec...
阅读全文
摘要:题意是n=1时输出字符串1;n=2时,数上次字符串中的数值个数,因为上次字符串有1个1,所以输出11;n=3时,由于上次字符是11,有2个1,所以输出21;n=4时,由于上次字符串是21,有1个2和1个1,所以输出1211。依次类推,写个countAndSay(n)函数返回字符串。 string unguarded_convert(const string &say) ...
阅读全文
摘要:题意是有个高度数组,就相当于隔板的高度,求数组中任意两隔板间盛水的最大量。隔板间的距离与较低隔板的高度乘积即为盛水的容量。 int maxArea(vector<int> &height) { int capability = 0; size_t left = 0, right = height.size() - 1; ...
阅读全文
摘要:实际上是个宝石迷阵消除游戏的简化版,把不同颜色的宝石看成不同值的数字,然后连通超过三个的可以消除。这里没有加入消除后降落的机制,一定程度上简化了问题的复杂度。那种需要每次消除后都从头遍历…… #include <iostream> using namespace std; template<typename T> T &val(T *...
阅读全文
摘要:面试到了一个topk,这个原理很简单,但是以前很少写过。面试时写的有点小慢,没有达到行云流水的地步。于是回来再写一遍练练。其中,堆排序部分采用简明排序代码。用完整的TopK代码: #include <iostream> #include <algorithm> using namespace std; template<typenam...
阅读全文
摘要:今天跟同学讨论面试题,又提到这个题了。之前在论坛里有人说是MSRA用过的面试题。题是这样的,假设有1棵二叉树,已知这棵树的节点上不均匀地分布了若干石头,石头数跟这棵二叉树的节点数相同。石头只能在子节点和父节点之间搬迁,每次只能搬运一块石头。请问如何以最少的步骤将石头搬运均匀,使得每个节点上的石头刚好为1。 我想到的是用后根遍历解,除了递归不需要额外空间,时间复杂度O(n)。 ...
阅读全文
摘要:class Solution { public: vector<vector<int> > combine(int n, int k) { vector<int> vecTmp; m_vecRet.clear(); combination(1, n,...
阅读全文
摘要:class Solution { public: vector<vector<int> > combinationSum2(vector<int> &num, int target) { vector<int> vecTmp; m_vecRet.clear(); ...
阅读全文
摘要:class Solution { public: vector<vector<int> > combinationSum(vector<int> &candidates, int target) { vector<int> vecTmp; m_vecRet.clear(); ...
阅读全文
摘要:爬楼梯,就是斐波纳契数列。 // f(n) = f(n - 1) + f(n - 2). // f(1) = 1. // f(2) = 2. int climbStairs(int n) { int a = 1, b = 2; int c = 0; if (n == 1) return a...
阅读全文
摘要:实现二叉树中序非递归遍历。 /** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left...
阅读全文