刷题之路
文章平均质量分 73
wxx2222222
代码虐我千百遍,我待代码如初恋
展开
-
实现一个Add函数,让两个数相加,但是不能使用+、-、*、/等四则运算符。ps:也不能用++、--等等
第一次看到这个题,哇真是变态,不能用四则运算还要算出来加法,后来仔细想了想,可以用位运算,以下是剑指offer上的解决方法。 以5+14为例,5——0101,14——1110。要求得这个加法的结果,其实步骤有以下几步:1.只加数字,不进位,则可得结果 11——1011;(两个1加起来为10,但不算进位的话就为0)2.做进位,可以得到第3位时有进位,进位的值时100原创 2017-07-15 16:15:21 · 1510 阅读 · 0 评论 -
删除小写字母字符串中重复字符
具体场景:删除小写字母字符串中重复字符。如果可以,优先删除重复字符中排在比他小字符前面的字符。 比如,输入:bbcacdww;输出:bacdw思路:1.先将字符的出现次数统计好。2.再重新遍历一遍,如果出现次数是一次就直接拷贝到另一个数组,如果次数不是1,就直接进行下一次,然后次数--。参考代码如下:void DeletePar(char a[],i原创 2017-08-09 17:04:48 · 605 阅读 · 0 评论 -
将N个字符的数组,循环右移K位。时间复杂度O(N)
思路:示例:char a[] = {nihao},若k为12,size为5.1.若k比数组的size大很多,则求模,得到适当大小的k值。k=k%size=2;2.将【0,size-k)区间的值反转。{hinao}3.将【size-k,size)区间的值反转。{hinoa}4.将【0,size)区间的值反转。{aonih}参考代码如下:void Reverse(cha原创 2017-08-09 15:54:18 · 461 阅读 · 0 评论 -
求一个无序数组的中位数
求一个无序数组的中位数。 如:{2,5,4,9,3,6,8,7,1}的中位数为5,{2,5,4,9,3,6,8,7,1,0}的中位数为4和5。 要求:不能使用排序,时间复杂度尽可能高。 提示:考虑堆或者快排思想解决。思路一:利用堆排序的思路将前n/2的元素放进一个大堆里,然后将后续的元素与堆顶比较,如果比堆顶大,则继续比下一个,如果比堆顶小,则与堆顶的值进行交换。原创 2017-08-09 15:11:46 · 567 阅读 · 0 评论 -
求出大家最喜欢吃的前k种水果(求数组中出现次数最多的)
场景: 本公司现在要给公司员工发波福利,在员工工作时间会提供大量的水果供员工补充营养。由于水果种类比较多,但是却又不知道哪种水果比较受欢迎,然后公司就让每个员工报告了自己最爱吃的k种水果,并且告知已经将所有员工喜欢吃的水果存储于一个数组中。然后让我们统计出所有水果出现的次数,并且求出大家最喜欢吃的前k种水果。void GetFavoriteFruit(const vec原创 2017-08-08 15:38:20 · 421 阅读 · 0 评论 -
用shell脚本实现希尔排序
代码如下:#!/bin/bashfunction shellsort(){ let size=$# a=($@) echo "原序列为:" ${a[@]} let gap=$size while [ $gap -gt 1 ] do let gap=gap/3+1 #echo "gap=" $gap for(( i=gap; i<size; ++i))原创 2017-08-08 13:36:27 · 310 阅读 · 0 评论 -
实现一个栈Stack,Push、Pop、Min(返回最小值的操作)的时间复杂度为O(1)
【思路】可以用两个栈来实现,s1为存储栈,s2为辅助栈。 入栈时,往s1里入栈,然后若s2为空,则s2也入栈,若s2不为空,则将s1里的栈顶与入栈的数字比较,若栈顶小,则s2不入栈,否则,s2,入栈。 出栈时,s1栈顶和s2栈顶比较,若相等,则s1和s2都出栈,否则,只是s1出栈。【代码如下】template class Sta原创 2017-07-19 23:20:47 · 357 阅读 · 0 评论 -
将二叉搜索树转换成一个排序的双向链表
【题目具体】 将二叉搜索树转换成一个排序的双向链表,要求不能创建任何新的结点,只能调整树中结点指针的指向,也就是left当prev,right当next。以如下的二叉树为例:要将此二叉树转化称为如下的双向链表:则步骤可以分以下:1.先找到最左边的结点0作为头结点。2.原创 2017-07-31 22:17:12 · 542 阅读 · 0 评论 -
用两个栈实现队列,用两个队列实现一个栈
bj原创 2017-07-18 14:16:37 · 262 阅读 · 0 评论 -
给出入栈顺序,判断元素出栈顺序的合法性
【思路】给出入栈顺序,判断出栈顺序的合法性。大致算法如下:以入栈顺序 1 2 3 4 5,出栈顺序2 1 3 5 4 为例1.先判断p1 p2不相等,1入栈,p1++然后p1和p2相等,p1++,p2++;2.判断栈顶元素1和p2相等,则出栈且p2++;3.p1的值和p2相等,都为三,则p1++,p2++;4.s为空,p2->5和p1->4不相等原创 2017-07-20 21:58:49 · 752 阅读 · 0 评论 -
判断两个链表是否相交,若相交,求交点
【不带环】判断两个链表是否相交: 1、把第二个链表连接到第一个后面,判断得到的链表是否有环,有环则相交,并求交点。(判断是否带环并求交点可点击此处到另一篇博客) 2、先遍历第一个链表,记住最后一个节点,再遍历第二个链表,得到最后一个节点时和第一个链表的最后一个节点做比较,如果相同,则相交。求交点时,定义两个计数器,分别记录各个链表的个数,然后让长的向短的对齐,然后一原创 2017-07-17 15:26:11 · 524 阅读 · 0 评论 -
创建不能被继承的类?只在栈上?只在堆上?
【不被继承】首先想到的是在C++中,子类的构造函数会自动调用父类的构造函数。同样,子类的析构函数也会自动调用父类的析构函数。要想一个类不能被继承,只要把它的构造函数和析构函数都定义为私有函数。那么当一个类试图从它那继承的时候,必然会由于试图调用构造函数、析构函数而导致编译错误。可是这个类的构造函数和析构函数都是私有函数了,怎样才能得到该类的实例呢?可以通过定义静态来创建和释放类原创 2017-07-17 10:03:13 · 221 阅读 · 0 评论 -
链表是否带环?环长?入口?时间复杂度?
【是否带环】 基本思路:定义两个指针从头结点开始,一个一次向后走一步,一次走两步,循环,若能够走到NULL,则不带环,若走到两个指针相等,则带环。代码如下:pair HasCircle(PNode phead)//判断是否带环,带环的话环的长度,入口。{ assert(phead); //时间复杂度是O(n) PNode pcur =原创 2017-07-17 09:45:45 · 362 阅读 · 0 评论 -
模拟实现c库的atoi和itoa
atoi是将数字符号的字符串转化为整形。itoa是将整形转化为字符串。参考代码如下void Reverse(char * start,char* end){ char *l = start; char *r = end; while (l < r) std::swap(*l++,*r--);}char *my_itoa( int value, char *str原创 2017-08-10 15:48:41 · 311 阅读 · 0 评论