摘要:
请实现一个函数,把字符串中的每个空格替换成%20。(详见string)请实现时间复杂度为O(n)的计数排序。2、思路: 另外开辟一个数组空间,下标是原数组元素,下标指向的内容是原数组元素出现的次数。先记录原数组元素出现次数,再c[i]+=c[i-1],c[i]表示≤i的数出现的次数,然后从尾往前遍历原数组,这样可以保持稳定性。CountSort 1 //其中a为输入,b为输出,n为元素个数,k为最大元素 2 void count_sort_upgrade(int a[], int b[], int n, int k) 3 { 4 int j; 5 int *c = new ... 阅读全文
摘要:
输入一个字符串,输出该字符串中字符的所有组合。举个例子,如果输入abc,它的组合有a、b、c、ab、ac、bc、abc。实现一个算法打印出n对括号的有效组合。1、思路: 假设我们想在长度为n的字符串中求m个字符的组合。我们先从头扫描字符串的第一个字符。针对第一个字符,我们有两种选择:第一是把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选取m-1个字符;第二是不把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选择m个字符。这两种选择都很容易用递归实现。 1 #include <iostream> 2 #include <vector> 3 4 u 阅读全文
摘要:
快排的一种实现。(详见Sort)输入一个正数sum,打印出所有和为sum的连续正数序列(至少含有两个数)。输入两个字符串,从第一个字符串中删除第二个字符串中的所有字符。(详见String)1、思路: 将随机base放在尾部,设置small和big指针从头有先后的前进。每次big前进,判断是否小于base:如果小于base,那么small和big需要互换,然后small++;如若不然则跳过。Partition 1 int Partition(int* data, int length, int start, int end) 2 { 3 if (data == NULL || len... 阅读全文
摘要:
char* _strcpy(char* dest, const char* src){ assert(dest != NULL && src != NULL); if (dest == src) return dest; char* temp = dest; while ((*dest++ = *src++) != '\0'); return temp;}char* _strncpy(char* dest, const char* src, unsigned int n){ assert(dest != NULL && src != NULL). 阅读全文
摘要:
快排分割数组首尾的实现方式。输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。要求时间复杂度为O(n)。输入一个增序数组和一个数sum,在数组中找到两个数,使得和为sum。输入任意一对即可。1、思路: 先随机选base,与尾交换。然后从左往右遍历,找到比base大的数,交换;从右往左遍历,找到比base小的数,交换。QuickSort 1 #include <iostream> 2 #include <exception> 3 #include <stdlib.h> 4 #include <string 阅读全文
摘要:
给定一个十进制整数N,求出从1到N的所有整数中出现1的个数。给定一个整数N,那么N的阶乘N!末尾有多少个0? 阅读全文
摘要:
如果两个数a和b,a的所有真因数之和等于b,b的所有真因数之和等于a,则称a,b是一对亲和数。求50000以内的所有亲和数,真因数不包括本身。只有1和本身作为因子的数称作素数。求1000以内的所有素数,习惯上1不作为素数。我们把只包含因子2、3和5的数称为丑数。求按从小到大的顺序排列的第1500个丑数。习惯上我们把1当做第一个丑数。1、思路: 常规方法:对每个数i(从1到N)进行处理,处理的方法是用j(从1到i/2)进行取余,看是否为0。能整除的话,sum[i] += j。 伴随数组:从因子2开始处理,对于下标是2的倍数说明因子含有2;接下去处理因子3,对于下标是3的倍数说明因子含有3;依.. 阅读全文
摘要:
参考:http://zhedahht.blog.163.com/判断一个字串是否是回文。输入一个字符串,输出该字符串中最长的回文子字符串的长度。1、思路: 只要从两头开始同时向中间扫描字串,如果直到相遇两端的字符都一样,那么这个字串就是一个回文。我们只需要维护头部和尾部两个扫描指针即可;另一种方法是从中间开始、向两边扩展查看字符是否相等。2、思路: 遍历字符串,对每一个字符往两边扩展,看两侧的字符是否相同,这样时间复杂度是O(n2)。注意扩展时考虑奇数和偶数两种情况。GetLongestSymmetricalLength 1 int GetLongestSymmetricalLength_.. 阅读全文
摘要:
参考:http://zhedahht.blog.163.com/定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。1、思路: 我们首先对X和Y两段分别进行翻转操作,这样就能得到XTYT。接着再对XTYT进行翻转操作. 阅读全文
摘要:
参考:http://zhedahht.blog.163.com请实现一个函数,把字符串中的每个空格替换成%20。输入两个字符串,从第一个字符串中删除第二个字符串中的所有字符。1、思路: 两题遇到的问题都是无论是替换还是删除,都会导致之后的字符需要整体移动,如何在O(n)的时间复杂度下完成操作,往往需要两个指针。这题先遍历一遍记录下空格数,然后设置两个指针,一个指针指向替换成%20之后的末尾,一个指针指向原始字符串的末尾。两个指针同时往前移,并前指针的内容拷贝到后指针的位置。前指针遇到空格,后指针填充%20,然后两个指针继续往前移,终止条件是前指针和后指针重合。ReplaceBlank 1 v. 阅读全文