摘要:如:a=12345求各位的值分别是多少;0(个位): a%10 =5 (只要mod10就是取一个数的个位,但是mod100不是取10位,而是取十位和个位,同理类推)10(十位):(a/10)=1234,再1234%10=4;100(百位)a/100=123;再mod10得出规律:只要把a除以pow(10,i);然后在mod10即可求出第i位的值。#include#includeusing namespace std;//求总位数int getNumOfDigits(int a){ int count=0; while(a) { a/=10; ... 阅读全文
基数排序
2013-09-01 20:48 by youxin, 1871 阅读, 0 推荐, 收藏,
摘要:基数排序(英语:Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。基数排序的发明可以追溯到1887年赫尔曼·何乐礼在打孔卡片制表机(Tabulation Machine)上的贡献[1]。它是这样实现的:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。基数排序的方式可以采用LSD(Least signif 阅读全文
数据结构之后缀数组suffix array
2013-09-01 03:44 by youxin, 520 阅读, 0 推荐, 收藏,
摘要:在字符串处理当中,后缀树和后缀数组都是非常有力的工具,其中后缀树大家了解得比较多,关于后缀数组则很少见于国内的资料。其实后缀是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现,能够实现后缀树的很多功能而时间复杂度也不太逊色,并且,它比后缀树所占用的空间小很多。可以说,在信息学竞赛中后缀数组比后缀树要更为实用。因此在本文中笔者想介绍一下后缀数组的基本概念、构造方法,以及配合后缀数组的最长公共前缀数组的构造方法,最后结合一些例子谈谈后缀数组的应用。基本定义:子串字符串 S 的子串 r[i..j] , i ≤ j ,表示 r 串中从 i 到 j 这一段,就是顺次排列 r[i],r[i+1],.. 阅读全文
面试题:最长回文子串(即求对称字符串的最大长度 )
2013-09-01 03:44 by youxin, 482 阅读, 0 推荐, 收藏,
摘要:题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”, 因此输出4。分析:可能很多人都写过判断一个字符串是不是对称的函数,这个题目可以看成是该函数的加强版。 阅读全文
百度面试题:把数组排成最小的数
2013-09-01 03:30 by youxin, 1891 阅读, 0 推荐, 收藏,
摘要:问题描述:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。例如输入数组{32, 321},则输出这两个能排成的最小数字32132。请给出解决问题的算法,并证明该算法。很显然,数前面的越小越好。 思路:先将整数数组转为字符串数组,然后字符串数组进行排序,最后依次输出字符串数组即可。这里注意的是字符串的比较函数需要重新定义,不是比较a和b,而是比较ab与 ba。如果ab ba,则a > b;如果ab = ba,则a = b。比较函数的定义是本解决方案的关键。这道题其实就是希望我们能找到一个排序规则,根据这个规则排出来的数组能排成一个最小的数字。证明:为什么这样 阅读全文
面试题:在O(1)时间删除链表结点
2013-09-01 03:20 by youxin, 409 阅读, 0 推荐, 收藏,
摘要:题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。链表结点与函数的定义如下:struct ListNode{ int m_nValue; ListNode* m_pNext;};void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted);删除结点的操作我们经常碰到,比如一个链表A->B->C->D->E->F->G。如果我们要删除结点E,那么我们只需要让结点D的指针指向结点F即可,但是我们现在只给出链表头结点的指针以及结点E的指针,而又是单项链表,不能在O(1)时间内 阅读全文
从第一字符串中删除第二个字符串中所有的字符
2013-09-01 02:39 by youxin, 2823 阅读, 0 推荐, 收藏,
摘要:题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的字符串变成”Thy r stdnts.”。分析:题目可分解为如何判断一个字符串中包含特定字符以及如何在一个字符串中删除特定字。判断一个字符串是否包含是定字符,可首先创建一个字符串的Hash表,把字符串中对应的字符对代表的hash元素置为1.字符参数所代表Hash元素值是为1就表示字符存在。(这种“字符串hash”的思想要掌握,可以快速在一些字符中查找某个字符)在一个字符串中删除指定字符,比较好的方法是通过快慢消除法。具体实现如下:#include # 阅读全文
在一个字符串中找到第一个只出现一次的字符
2013-09-01 02:27 by youxin, 843 阅读, 0 推荐, 收藏,
摘要:题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。分析:可通过循环每一个字符看后面的子串是否包含这个字符。但是效率不高。一种比较有效的方法是创建一个字符数次hash表。具体实现如下:#include #include #define N 256 int charHash[N] = {0}; void initCharHash(const char *s){ while(*s) { charHash[*s]++; s++; }}char findFirstOnceChar(const ch... 阅读全文
大整数运算
2013-09-01 02:18 by youxin, 2850 阅读, 0 推荐, 收藏,
摘要:C/C++中的int类型能表示的范围是-2E31-2E31–1。unsigned类型能表示的范围是0-2E32–1,即 0-4294967295。所以,int和unsigned类型变量,都不能保存超过10位的整数。有时我们需要参与运算的数,可能会远远不止10 位,例如,可能需要保留小数点后面100位(比如求π的值),那么,即便使用能表示很大数值范围的double变量,但是由于double变量只有64位,所以还是不可能达到精确到小数点后面100位这样的精度。 double变量的精度也不足以表示一个100位的整数。一般我们称这种基本数据类型无法表示的整数为大整数。如何表示和存放大整数呢?基本的.. 阅读全文
输出1到最大的N位数
2013-08-31 23:42 by youxin, 892 阅读, 0 推荐, 收藏,
摘要:题目:输入数字n,按顺序输出从1最大的n位10进制数。比如输入3,则输出1、2、3一直到最大的3位数即999。分析:这是一道很有意思的题目。看起来很简单,其实里面却有不少的玄机。应聘者在解决这个问题的时候,最容易想到的方法是先求出最大的n位数是什么,然后用一个循环从1开始逐个输出。很快,我们就能写出如下代码:void Print1ToMaxOfNDigits1(int n){ int number=1; int i=0; while(i++using namespace std;// Increment a number. When overflow, return true... 阅读全文
浙公网安备 33010602011771号