CHuiL

二维数组中的查找

剑指offer

题目 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 解法 从右上角开始比较,若大于目标值,则范围剔除当前列(因为下面的都比他大),若小于,则提出当前行(因为前面的都比他小);相等就返回; 代码 bool Find(int target...

求1+2+3+...+n

剑指offer

题目描述 求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。 解法 利用&&的短路特性,即前面为false,后面不执行作为结束递归的条件; 代码 int Sum_Solution(int n) { int ans = n ; ans &&a...

构建乘积数组

剑指offer

题目描述 给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…A[i-1]A[i+1]…A[n-1]。不能使用除法。 解法 如果可以用除法,直接求出A的总乘积,然后再除以某个A[i]就好了; 这里可以先从头到尾将A[0]~A[i-1]依次乘起来,先放到B中;然后再从尾到头乘上去,依次和B中的值乘并存入B中; 代码 ...

数组中重复的数字

剑指offer

题目 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。 也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。 解法 暴力,哈希容易想到,哈希需要额外空间; 这里利用这道题的条件,数字范围在0~n-1之内,所以每个数可以移到他...

数值的整数次方

剑指offer

题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 解法 题目本身不难;但是需要考虑边界值如底数为0的情况,以及指数为负数; 底数为0其实是一种错误,需要返回错误; 指数为负数先进行指数为正的运行,然后将结果取倒数,所以如果底数为0,指数又为负数则是一种错误; 求a^n的公示可以为 { a^(n/2)*a^(n/2) ...

不用加减乘除做加法

剑指offer

题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。 解法 先不考虑进位,直接每一位相加 0+1 = 1, 1 + 1 = 0 ,0+ 0 =0;是异或 操作;求出来后在考虑进位,只有1+1的时候才会有进位,使用与运算求得,而且是先前进1,所以求出来后左移一位,与刚才求得的结果相加,即得结果; 代码 int Add(int num1, int ...

n个骰子的点数

剑指offer

题目描述 把n个骰子投出去,所有点数和记为s,输入n,求所有可能的s出现的概率; 解法 s的所有可能为 n~6*n;所以按照排列的思路,分为第一个和后面的n-1个,然后依次求出每种可能的和,并用一个6n-n+1大的数组存储每一个值出现的次数;最后每个值出现的次数除以总个数;递归容易写,但效率低; 假设现在是循环计算到了第n个骰子,那么第n的骰子的可能出现的和为n~6n; 设f(k)表示和...

翻转单词顺序列

剑指offer

题目描述 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么? 解法 两步翻转,...

滑动窗口的最大值

剑指offer

题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],...

数组中只出现一次的数字

剑指offer

题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。 解法 这道题可以使用异或运算来求解。同个数字偶数次相异或的结果为0,所以我们可以将所有的数字依次异或,那么最终的结果就相当于那两个不同的数字异或的结果。 因为两个数字不同,所以异或的结果肯定不为0,因为10异或为1,所以可以找出第一个1出现的位置,然后在根据这个位置是1还是0,将所有数...