算法
zzuRingo
coding烧酒努力中
展开
-
[2016/11/14]naive问题中异或的巧妙用法
一道简单题,大意是给你一个数组,除了一个数只出现一次,其他全部的数字都出现了两次。求那个数。 正常人的思路都是先sort一遍,再写个step为2的for循环找。这样做时间复杂度nlogn+n,空间复杂度1。 但是!!!下面这个做法用了相同的空间复杂度,时间复杂度仅为n。 巧妙利用了按位异或的性质:一样为0,不一样为1。最后异或之后只剩下不同的数啦! 粘了代码如下:int singleNumb原创 2016-11-14 10:51:34 · 353 阅读 · 0 评论 -
[2016/12/19]kmp算法
上学期上数据结构的时候就学了这个算法,可是没好好听(摊手)。这次刷题的时候遇到了一个字符串匹配题,于是学会了这个算法。看了这么多博客,觉得对原理讲得比较好的就是这篇:戳这里。如果想理解,重点还是前后缀的概念。还有中间怎么跳的,这个自己写两个字符串,模拟一下就行。下面的代码写得非常好,对理解很有帮助。为了帮助理解,加入了一些输出。#include <iostream>#include <stdio.原创 2016-12-19 15:03:16 · 396 阅读 · 0 评论 -
[2016/12/14]统计一个串里segment的个数
题目大意串被空格分成若干segment,求它们的个数。我的思路c的话就老老实实根据空格和其前后字母判断吧。。 python一行就行了,split后再求len。别人的代码(题目很简单。。但是我写得很麻烦。在下面看到了别人的代码, 觉得非常简洁,巧妙,所以粘上来)class Solution {public: int countSegments(string s) { int原创 2016-12-14 16:27:15 · 463 阅读 · 0 评论 -
[2016/11/28]判断一个数是否是回文数,但不能开多余空间
题目大意如题。所以转成字符串再判断显然不行。思路所以怎么做呢?思考回文数的特点。翻转所得到的数字还是原来的数。所以,如果能翻转这个数字,再把结果和原来的数比较,就可以得知这个数是不是回文数了。代码代码如下bool isPalindrome(int x) { if(x<0) return false; int val = x; int total = 0; int en原创 2016-11-28 17:08:50 · 464 阅读 · 0 评论 -
[2016/12/8]happy number:application of Floyd's Cycle Detection Algorithm
题目大意求一个数是不是happy number(定义戳这里)我的思路数字如果不是happy number,就会一直被困在循环里,因为会出现同一个数字出现两次的情况。直接的思路是用set,如果一个数字出现了两次,就返回false。别人的思路我的做法空间复杂度略高。看了下面别人的解,空间复杂度仅为N1。大致就是设立快慢两个指针,如果存在环,两个指针一定会相遇。 参考:Floyd’s Cycle Det原创 2016-12-08 19:15:19 · 433 阅读 · 0 评论 -
[2016/11/25]九宫格问题
题目大意数独规则点这里 注意可以有格子是空的。空的格子用“.”表示。方法一.位运算知道了这个之后,就很好办啦。因为数字只有九个,而且不允许重复出现。直接想到位运算!表示当前数字,只需要把1向右移动当前数字位。然后设置一个状态变量,存储当前有多少数字出现过。把他们相与,如果为0说明此数字还没出现过,就更新这个状态变量,即把他们做或运算。 计算3*3格子的时候参考了别人的代码,想法很巧妙,直接两重循原创 2016-11-25 16:44:37 · 731 阅读 · 0 评论 -
[2016/12/6]计算两个大数的和
题目大意如题,两个数字都以字符串的形式被给出。返回值是字符串别人的代码觉得很简单直接就A了。。但是看了别人的方法,才发现自己的思路太繁琐,繁琐在细分了很多终止条件。其实这些条件一言以蔽之,就是下面代码while的循环条件。 下面是大神的代码class Solution {public:string addStrings(string num1, string num2) { int i原创 2016-12-06 20:35:25 · 471 阅读 · 0 评论 -
[2016/12/5]判断一个int类型数是不是2的幂
题目大意如题。。记得某次实验室周赛的时候做过这道题。那个时候直接打表过的,因为最多只有31种可能。现在依然打表→_→ 但是看到了别人的一种特别巧妙的做法,就保存一下。代码class Solution {public: bool isPowerOfTwo(int n) { return n > 0 && !(n&(n-1)); }};算法原理如果一个数是2的幂(0除原创 2016-12-05 20:17:14 · 499 阅读 · 0 评论 -
[2016/12/5]不用第三个变量交换两个数字
记得以前看到过这个方法,不过一直没记住。今天做题的时候突然要用交换两个变量。所以就想用这种方法啦! 题目很简单,就是求斐波那契数列和。 代码如下:int climbStairs(int n) { if(n == 1) return 1; if(n == 2) return 2; int a = 1; int b = 2; for(int i = 3;i<=原创 2016-12-05 10:54:50 · 377 阅读 · 0 评论 -
[2016/11/21]机智的算法:在长度为len的数组中找出出现次数大于len/2的元素
题意如标题所说。注意,默认此数组中有元素的出现次数为len/2。 刚开始看到这道题,觉得简单到爆。直接sort一遍再取len/2处的元素不就行了嘛。这样的时间复杂度为nlogn。 后来看了下面这种别人的做法,觉得十分巧妙。膜膜膜!这种算法叫majority vote algorithm,时间复杂度为n。 大致思路是: As we sweep we maintain a pair consi原创 2016-11-21 18:18:13 · 610 阅读 · 0 评论 -
[2016/12/2]求一个32位二进制数中1的数量
思路直接位运算走起,没啥好说的。代码int hammingWeight(uint32_t n) { int num = 1; int count = 0; while(n){ if(num & n) count ++; n = n >> 1; } return count;}原创 2016-12-02 11:05:22 · 663 阅读 · 0 评论 -
[2016/12/1]判断是否存在重复元素 -- c++ set的巧妙用法
题目大意给你一堆int型元素,判断里面是否有重复元素。有返回TRUE,没有则返回FALSE。我的思路sort一遍再遍历,找出重复元素后return true,其他return false。set方法把数组中的元素全部添加进set,然后比较数组大小和set大小。如果相等则return false,反之则return true.set代码bool containsDuplicate(vector<int原创 2016-12-01 11:34:04 · 9115 阅读 · 1 评论 -
[2016/11/17]不用加减号,求两个数的和
题目说不用普通运算符,首先想到的就是用位运算。那用位运算该怎么做呢?这时就拿起纸笔,看看你自己是怎么做二进制加法的。只要你明白了,就能告诉计算机该怎么做。 首先发现,在做某位的加法时,单看这一位。如果两个数相同,得出的是0,反正为1。这不就是异或嘛! 知道了这个,怎么处理进位呢?继续做,发现进位的特点是:都是进到下一位,且当且仅当两个加数都是1时,才可产生进位(明显是按位与啊)。把按位与得到的数原创 2016-11-17 11:27:45 · 1265 阅读 · 0 评论 -
[2017/2/14]简单快速幂
好久都没更博了qwq题意给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。思路1.exponent是int类型,所以可正可负可为0。 2.最简单的方法就是粗暴地直接乘,但是时间复杂度高。 3.所以应该用快速幂。关于快速幂exponent转二进制,二进制中每一位都是后一位的2倍。 算式好麻烦。。不写了。如果不会可以百度关键字:快速幂。c原创 2017-02-14 10:44:55 · 382 阅读 · 0 评论