<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[u012724503的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/u012724503</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; u012724503]]></copyright><item><title><![CDATA[面试题45:约瑟夫环]]></title><link>https://blog.youkuaiyun.com/u012724503/article/details/60745708</link><guid>https://blog.youkuaiyun.com/u012724503/article/details/60745708</guid><author>u012724503</author><pubDate>Tue, 07 Mar 2017 09:17:37 +0800</pubDate><description><![CDATA[问题：1，2，3，......，n-1，n这n个数字排成一个圆圈，从数字1开始每次从这个圆圈里删除m个数字。求出这个圆圈里剩下的最后一个数字。


思路：利用STL中的list来模拟这个操作。
int Joseph(int n, int m)
{
    list numbers;
    
    for(int i = 1; i <= n; i++)
        numbers.p]]></description><category></category></item><item><title><![CDATA[面试题42:翻转单词顺序，左旋转字符串]]></title><link>https://blog.youkuaiyun.com/u012724503/article/details/60580055</link><guid>https://blog.youkuaiyun.com/u012724503/article/details/60580055</guid><author>u012724503</author><pubDate>Mon, 06 Mar 2017 15:44:36 +0800</pubDate><description><![CDATA[题目一：输入一个英文句子，翻转句子中单词的顺序，但单词内字符的顺序不变。为简单起见，标点符号和普通字母一样处理。
例如输入"I am a student."，则输出"student. a am I"。


思路：这个题目流传甚广，很多公司都多次拿来作面试题。首先，我们先考虑如何将一个字符串给反转过来，
void ReverseWord(char *pBegin, char *pEnd)]]></description><category></category></item><item><title><![CDATA[面试题41:和为s的两个数字，和为s的连续正数序列]]></title><link>https://blog.youkuaiyun.com/u012724503/article/details/60575788</link><guid>https://blog.youkuaiyun.com/u012724503/article/details/60575788</guid><author>u012724503</author><pubDate>Mon, 06 Mar 2017 14:12:54 +0800</pubDate><description><![CDATA[题目一：输入一个递增排序的数组和数字，在数组中查找两个数，使得它们的和正好是s。如果有多对数字的和等于s，输出任意一对即可。
例如输入数组{1，2，4，7，11，15}和数字15，由于4+11=15，因此输出4和11。
思路：可以利用2个指针，分别指向数组的第一个元素和最后的一个元素，如果两元素之和大于我们输入的和，则将第二个指针向左移一位，如果两元素之和小于我们输入的和，则将第一个指针向右移]]></description><category></category></item><item><title><![CDATA[面试题40:数组中只出现一次的数字]]></title><link>https://blog.youkuaiyun.com/u012724503/article/details/60570843</link><guid>https://blog.youkuaiyun.com/u012724503/article/details/60570843</guid><author>u012724503</author><pubDate>Mon, 06 Mar 2017 09:55:09 +0800</pubDate><description><![CDATA[题目：一个整形数组里除了两个数字之外，其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n)，空间复杂度是O(1)。
思路：利用异或的方法。假如一个数组中，除了一个数字只出现了一次之外，其他的所有数字都出现了两次，则可以让数组中的每个数字进行异或，最后的结果就是只出现一次的那个数。因为相同的两个数的每一位都一样，所以相同的两个数异或的结果为0。因此那些成对出现两次的]]></description><category></category></item><item><title><![CDATA[面试题38:数字在排序数组中出现的次数]]></title><link>https://blog.youkuaiyun.com/u012724503/article/details/59155290</link><guid>https://blog.youkuaiyun.com/u012724503/article/details/59155290</guid><author>u012724503</author><pubDate>Wed, 01 Mar 2017 21:33:07 +0800</pubDate><description><![CDATA[问题：统计一个数字在排序数组中出现的次数。例如输入排序数组{1，2，3，3，3，3，4，5}和数字3，
由于3在这个数组中出现了4次，因此输出4。
思路：因为数组是排序的，所以我们可以利用折半查找来找到我们要找的这个数字。
找到这个数字之后，从左右两边依次开始继续检测，找到最左边和最右边的那个数字，相减就可以得到次数。]]></description><category></category></item><item><title><![CDATA[面试题37:两个单链表的第一个公共结点]]></title><link>https://blog.youkuaiyun.com/u012724503/article/details/59118519</link><guid>https://blog.youkuaiyun.com/u012724503/article/details/59118519</guid><author>u012724503</author><pubDate>Wed, 01 Mar 2017 19:11:45 +0800</pubDate><description><![CDATA[题目：输入两个单链表，找出它们的第一个公共结点。链表结点定义如下。
struct node
{
    int data;
    int *next;
};

思路1：如果两个链表有公共结点，则从那个公共结点开始，后面的结点都相同。
则可以用较长链表的长度 - 较短链表的长度 = m，将较长链表的表头指针先往前走m步
在同时将2]]></description><category></category></item><item><title><![CDATA[面试题35:第一个只出现一次的字符]]></title><link>https://blog.youkuaiyun.com/u012724503/article/details/59116883</link><guid>https://blog.youkuaiyun.com/u012724503/article/details/59116883</guid><author>u012724503</author><pubDate>Wed, 01 Mar 2017 18:39:57 +0800</pubDate><description><![CDATA[题目：在字符串中找出第一个只出现一次的字符。如输入“abaccdeff”，则输出‘b’。
思路1:如果检测每一个字符的时候，都将字符串从头到尾扫描一遍，则需要时间复杂度为O(n^2)，效率太低。


思路2:利用哈希表的思想。统计字符串中每个字符出现的次数。
定义哈希表的键值(key)是所有字符(char类型有256种可能)，定义实值(value)为该字符出现的次数。
从头到尾扫描字符]]></description><category></category></item><item><title><![CDATA[面试题34:丑数]]></title><link>https://blog.youkuaiyun.com/u012724503/article/details/59114133</link><guid>https://blog.youkuaiyun.com/u012724503/article/details/59114133</guid><author>u012724503</author><pubDate>Wed, 01 Mar 2017 18:04:47 +0800</pubDate><description><![CDATA[问题：我们把只含因子2，3和5的数称作丑数。求按从小到大的顺序的第n个丑数。例如6，8都是丑数，但14不是，因为它包含因子7。习惯上我们把1当作第一个丑数。
思路1:写一个函数来判断某数是不是丑数，然后在从1开始累加寻找，直到找到第n个丑数。
bool IsUgly(int number)
{
    while(number % 5 == 0)
        number = number]]></description><category></category></item><item><title><![CDATA[面试题30:最小的k个数]]></title><link>https://blog.youkuaiyun.com/u012724503/article/details/56857983</link><guid>https://blog.youkuaiyun.com/u012724503/article/details/56857983</guid><author>u012724503</author><pubDate>Fri, 24 Feb 2017 20:24:34 +0800</pubDate><description><![CDATA[问题：输入n个数，找出其中最小的k个数。例如输入4，5，1，6，2，7，3，8这8个数字，则最小的4个数字是1，2，3，4。
思路1：利用问题题29的思想，利用快速排序中的partition，找到第pivot为k-1的位置，则从第0个数到第k-1个数为是最小的k个数。
此方法的时间复杂度为O(n)。(计算方法利用了等比数列求和)


思路2:思路1的方法改变了原序列n个数的顺序，如果不改]]></description><category></category></item><item><title><![CDATA[面试题29:最小的第k个数]]></title><link>https://blog.youkuaiyun.com/u012724503/article/details/56843108</link><guid>https://blog.youkuaiyun.com/u012724503/article/details/56843108</guid><author>u012724503</author><pubDate>Fri, 24 Feb 2017 15:54:03 +0800</pubDate><description><![CDATA[问题：输入n个数，找出其中最小的第k个数。例如输入4，5，1，6，2，7，3，8这8个数字，则最小的3个数字是3。
思路：我们可以利用快速排序中的partition,每经历一趟partition后，会找到一个pivot，在pivot这个位置上的元素就是排序完后最终的位置。
并且每趟partition后，在pivot位置左边的元素，都比在pivot这个位置的元素小。在pivot位置右边的元素，都]]></description><category></category></item><item><title><![CDATA[面试题28:全排列]]></title><link>https://blog.youkuaiyun.com/u012724503/article/details/56834249</link><guid>https://blog.youkuaiyun.com/u012724503/article/details/56834249</guid><author>u012724503</author><pubDate>Fri, 24 Feb 2017 10:33:38 +0800</pubDate><description><![CDATA[问题：输入一个字符串，打印出该字符串中字符的所有排列。例如输入字符串abc，则打印出字符a，b，c所能排列出来的所有字符串abc,acb,bac,bca,cab,cba.
思路1:利用STL中的next_permutation(...)来直接实现该功能。要包含头文件#include 。
void STLnext_permutation(char *s1, int length)
{
    d]]></description><category></category></item><item><title><![CDATA[面试题21:包含min函数的栈]]></title><link>https://blog.youkuaiyun.com/u012724503/article/details/56678045</link><guid>https://blog.youkuaiyun.com/u012724503/article/details/56678045</guid><author>u012724503</author><pubDate>Thu, 23 Feb 2017 18:55:16 +0800</pubDate><description><![CDATA[问题：定义栈的数据结构，请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中，调用min，push及pop的时间复杂度都是O(1)。
思路：使用一个辅助栈，辅助栈的栈顶始终是数据栈中最小的元素。比如数据栈3进栈，现在3是最小值，我们也把这个最小值压入辅助栈。
数据栈4进栈，此时数据栈中依然3是最小值，则将3继续压入辅助栈。数据栈2进栈，此时2是最小值，将2压入辅助栈。
此事数据栈中]]></description><category></category></item><item><title><![CDATA[面试题20:顺时针打印矩阵]]></title><link>https://blog.youkuaiyun.com/u012724503/article/details/56677150</link><guid>https://blog.youkuaiyun.com/u012724503/article/details/56677150</guid><author>u012724503</author><pubDate>Thu, 23 Feb 2017 17:49:43 +0800</pubDate><description><![CDATA[题目：输入一个矩阵，按照从外向里以顺时针的顺序依次打印出每一个数字。
例如      则依次打印出数字1，2，3，4，8，12，16，15，14，13，9，5，6，7，11，10



思路：可以看做不断打印几个依次缩小的圆圈。第一个圆圈的起点是(1,1)，第二个是(2,2)，依次类推。
int main(int argc, const char * argv[]) {
    int]]></description><category></category></item><item><title><![CDATA[面试题17:合并两个排序的链表]]></title><link>https://blog.youkuaiyun.com/u012724503/article/details/56497072</link><guid>https://blog.youkuaiyun.com/u012724503/article/details/56497072</guid><author>u012724503</author><pubDate>Wed, 22 Feb 2017 21:07:13 +0800</pubDate><description><![CDATA[问题：输入两个递增的单链表，合并这两个链表使新链表中的结点仍然是按照递增排序的。例如下图所示。






思路：我们先判断哪个结点是新链表中的第一个结点，将指针p1p2指向两个链表的头结点，因为p1指向结点的元素比p2指向的要小，所以L1中的结点为新链表中的第一个结点，并将p1向后挪一个。
然后我们继续从这2个链表中，找到较小的那一个结点继续插入到新链表的尾部，直至两个链表同时为]]></description><category></category></item><item><title><![CDATA[面试题15:链表中倒数第k个结点]]></title><link>https://blog.youkuaiyun.com/u012724503/article/details/56495072</link><guid>https://blog.youkuaiyun.com/u012724503/article/details/56495072</guid><author>u012724503</author><pubDate>Wed, 22 Feb 2017 19:31:08 +0800</pubDate><description><![CDATA[问题：输入一个单链表，输出该链表中倒数第k个结点。例如一个链表从头结点开始，各结点的值依次为1，2，3，4，5，6。倒数第3个结点的值为4。
思路：看到此题的第一想法，应该是想将链表从头到尾遍历一次，统计出链表有多少个结点，到处第k个结点在正数n-k+1处，在重新遍历一次，遍历到n-k+1个结点处，就是我们需要找到的那个结点。
但是这样子的解决方法，需要对链表遍历2次，面试官肯定会不满意，我们]]></description><category></category></item><item><title><![CDATA[面试题16:反转链表]]></title><link>https://blog.youkuaiyun.com/u012724503/article/details/56494831</link><guid>https://blog.youkuaiyun.com/u012724503/article/details/56494831</guid><author>u012724503</author><pubDate>Wed, 22 Feb 2017 19:13:00 +0800</pubDate><description><![CDATA[问题：定义一个函数，输入一个链表的表头结点，反转该链表并输出反转后的头结点。链表结点定义如下：
struct Node
{
    int data;
    Node* next;
};


思路：假设该链表为a->b->c->d->e，根据题意，需要将链表变为a
当我们使用2个指针的时候p1,p2。若将p1指向a，将p2指向b，需要执行b->next = a; 此时链表变为ad->e]]></description><category></category></item><item><title><![CDATA[面试题14:调整数组顺序使奇数位在偶数位前面]]></title><link>https://blog.youkuaiyun.com/u012724503/article/details/56304214</link><guid>https://blog.youkuaiyun.com/u012724503/article/details/56304214</guid><author>u012724503</author><pubDate>Tue, 21 Feb 2017 21:10:22 +0800</pubDate><description><![CDATA[题目：输入一个整数数组，实现一个函数来调整该数组中数字的顺序，使得所有奇数位于数组的前半部分，所有偶数位于数组的后半部分。
思路1:一拿到这个题的时候，想法应该是从头到尾开始遍历，如果指向的是偶数，则使偶数后面的所有元素都向前挪一位，然后将指向的这个偶数放到数组的最后一位。
这样每碰到一个偶数的时候，就需要移动O(n)个数字，因此总的时间复杂度是O(n^2)。


思路2:时间复杂度O(]]></description><category></category></item><item><title><![CDATA[面试题13:在O(1)时间内删除链表结点]]></title><link>https://blog.youkuaiyun.com/u012724503/article/details/56297304</link><guid>https://blog.youkuaiyun.com/u012724503/article/details/56297304</guid><author>u012724503</author><pubDate>Tue, 21 Feb 2017 20:08:02 +0800</pubDate><description><![CDATA[题目：给定单向链表的头指针和一个结点指针，定义一个函数在O(1)时间删除该结点。
struct ListNode
{
	int m_nValue;
	ListNode* m_pNext;
};


思路；如果按照常规方法，需要从头指针开始遍历，找到要删除的节点指针的前一个指针，使前一个指针在指向要删除结点的下一个结点，则需要时间复杂度为O(n)。
设要删除的节点指针为i，结点指针顺序为x]]></description><category></category></item><item><title><![CDATA[关联式容器：set和map]]></title><link>https://blog.youkuaiyun.com/u012724503/article/details/56282766</link><guid>https://blog.youkuaiyun.com/u012724503/article/details/56282766</guid><author>u012724503</author><pubDate>Tue, 21 Feb 2017 14:53:14 +0800</pubDate><description><![CDATA[set
1.set的底层由RB-tree来实现的
2.set中不允许有两个元素有相同的键值，所有元素都会根据元素的键值自动被排序
3.不能通过set的迭代器来改变set的元素值(set::iterator被定义为底层RB-tree的const_iterator，杜绝写入操作)
int main(int argc, const char * argv[]) {
    
    int a[]]></description><category></category></item><item><title><![CDATA[面试题12:打印1到最大的n位数]]></title><link>https://blog.youkuaiyun.com/u012724503/article/details/55802740</link><guid>https://blog.youkuaiyun.com/u012724503/article/details/55802740</guid><author>u012724503</author><pubDate>Sun, 19 Feb 2017 10:28:41 +0800</pubDate><description><![CDATA[题目：输入数字n，按顺序打印出从1到最大的n位十进制数。比如输入3，则打印1，2，3，4，5一直到最大的3位数999。
思路：看到题目的第一反应，应该是想到先把这个最大的数给找出来，然后在从1一直输出到这个数。void printToMax(int n)
{
    int maxNum = 1;
    
    for(int i = 0; i < n; ++i)
    {]]></description><category></category></item></channel></rss>