自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(176)
  • 收藏
  • 关注

原创 python爬虫实现自动发天气预报

两年前写的自动发天气预报的脚本,今天测试了一下发现依然还能运行。利用了itchat包,实际上调用的就是网页版微信的接口,有一个缺点就是时间长了不活跃会掉线,可以在win7的计划任务里设置每隔一分钟给自己发送一条空消息。# -*- coding: utf-8 -*-"""Created on Wed Aug 30 14:55:57 2017@author: moses1213"""...

2019-07-23 16:36:35 906

转载 浅谈MySQL中优化sql语句查询常用的30种方法

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中使用!=或3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中

2016-10-04 14:32:44 707

原创 三个骰子点数之和概率

题目出自美团点评在线笔试题,求三个骰子的点数之和概率最大的是?思路:三个骰子点数之和的范围是3~18,越靠近两边出现的概率越小,因此点数和概率最大的情况应该出现在中间位置。计算中间9,10,11,12出现的概率比较一下。首先计算出现9的概率:为了避免重复和遗漏,将点数和为9分成两种情况:(1)三个骰子点数都不相同:(1,2,6),(1,3,5),(2,3,4)(2)可以允许存在

2016-09-16 22:46:47 56114 2

原创 美团点评编程题

1.输入一个数组nums,要求返回一个新的数组count,count的i位置上放置的是nums[i]右边有多少比它小的数。例如输入: 1 2 3 4输出:0 0 0 0 这道题从右边倒着数比较好,可惜当时没有考虑到相邻的数相等的情况,美团点评的题目没有自己的测试用例,需要用户自己考虑到所有可能的情况……#include #include using namespace std;

2016-09-09 21:26:17 1521

转载 全概率公式、贝叶斯公式推导过程

(1)条件概率公式        设A,B是两个事件,且P(B)>0,则在事件B发生的条件下,事件A发生的条件概率(conditional probability)为:                     P(A|B)=P(AB)/P(B) (2)乘法公式         1.由条件概率公式得:                       P(A

2016-09-02 20:37:41 12035

原创 腾讯模拟笔试

编程题:有蛇形矩阵,比如宽为3的时候为 1    2    3                                                                    8    9    4                                                                    7    6    5,宽为4的

2016-09-02 10:13:38 795

原创 itoa函数的实现

#include using namespace std;//itoa函数的实现void MyItoa(int x, char* str){ int i, j; i = j = 0; char tmp[50]; bool negative = false; if(x < 0) { x = -x; negative = true; } while(x > 0)

2016-09-01 15:30:08 422

转载 C++11多线程编程

C++11开始支持多线程编程,之前多线程编程都需要系统的支持,在不同的系统下创建线程需要不同的API如pthread_create(),Createthread(),beginthread()等,使用起来都比较复杂,C++11提供了新头文件、、、等用于支持多线程。使用C++11开启一个线程是比较简单的,下面来看一个简单的例子:#include #include

2016-09-01 10:03:05 365

转载 Linux多线程编程

一直对多线程编程这一块很陌生,决定花一点时间整理一下。os:ubuntu 10.04  c++1.最基础,进程同时创建5个线程,各自调用同一个函数[html] view plain copy#include iostream>  #include pthread.h> //多线程相关操作头文件,可移植众多平台    

2016-09-01 10:00:17 314

转载 C++线程安全的单例模式

一、懒汉模式:即第一次调用该类实例的时候才产生一个新的该类实例,并在以后仅返回此实例。需要用锁,来保证其线程安全性:原因:多个线程可能进入判断是否已经存在实例的if语句,从而non thread safety.使用double-check来保证thread safety.但是如果处理大量数据时,该锁才成为严重的性能瓶颈。1、静态成员实例class Singleton

2016-08-24 18:08:07 335

原创 KMP代码实现

void GeneratePrefix(const string& pattern, int* prefix){ int length = pattern.size(); prefix[1] = 0; int LOLP = 0; //LOLP表示最长的前缀数组 int NOCM; //number of characters matched

2016-08-16 19:00:47 523

原创 内存限制下查找数组的重复数

题目:给定一个数组,包含1到n的整数,n最大为32000,数组可能含有重复的值,且n的取值不定。若只有4KB的内存可用,该如果打印数组中所有重复的元素?思路:检测重复数的题目做过很多了,通常是建议一个哈希表,对访问过的元素进行标记,当访问的元素未标记时,标记这一元素,如果已经标记,说明重复,输出。哈希表可以用数组实现,假设申请int型的大小为32000的数组,那么使用的空间大小为32000*4

2016-08-12 17:14:15 653

原创 位操作求余数

在一些位操作里可能需要求余数的操作,而且位操作执行效率更高,但除数为2的N次方时,位操作也是一种实现方式。总结了两种方法如下:1:MOD(X, M) = X - (X >> M) 2:MOD(X, M) = X&(M-1)  //M必须是2的N次方其实方法1就是低位置零的方法,也可以这样实现:假设M = 2^n, X & (~(1

2016-08-12 12:34:03 1798

原创 走格子问题

6×9的的方格中,起点的左下角,终点在右上角,从起点到终点,只能从下向上,从左向右走,问一共有多少种不同的走法。A.  4200B.   5005C.  1005D.  以上都不正确这原本是道选择题,答案选B。已选择题的思路的来解决这道问题,假设左下角坐标为(0,0),那么右上角坐标为(6,9)。从左下角走到右上角,横向要走9步,纵向走6步,不管采用哪种方式横向和纵向走的步

2016-08-09 17:21:08 2511

原创 八皇后问题的两种解法

八皇后问题,即八个皇后放在8*8的格子上,要求每个皇后不同行、不同列,也不再对角线上。解法一:全排列解法。八个皇后不同行,那么假设存在一个数组大小为8,数组下标代表行,0~7都会被占满,数组每个下标位置上的值代表当前皇后的列,即下标值代表皇后的行,数组值代表列。下标0~7肯定会不同,如果以0~7初始化数组,那么列也会完全不同。那么列的排列就是0~7八个数的全排列问题,剩下的就是要判断是不是在对

2016-08-07 23:32:08 1740 7

原创 硬币的表示法

题目:给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。思路:这个问题真的非常有意思,需要用到递归的思想。假设现在有50分,求它的表示法。(1)50分可以用0个25分硬币,这下剩下的问题就是50分用10分、5分和1分表示;(2)50分用1个25分表示,问题转化为25分用10分、5分和1分表示;(3)50分用2个25分表示,这时候返回1。所以可以看到这是一个

2016-08-07 17:37:10 651 3

原创 打印n对括号的全部有效组合

这道题最基本的思路是求出n对括号的全排列,然后对每种排列方式判定是否有效。判定方法如下:bool IsMatch(string& str){ if(str.size() % 2 != 0) return false; int result = 0; for(string::iterator it = str.begin(); it != str.end(); ++it) {

2016-08-06 19:16:42 1699

原创 给定因子求第K个数

题目:有些数的素因子只有3,5,7,请设计一个算法,找出其中第K个数。思路:因为只存在素因子3,5,7,所以这些数具有这样的形式:3^x * 5^y * 7^z。假设当前已经生成了一些数,那么产生下一个数应该还是拿3或5或7乘以已经生成的数中的某个数。这一步可以在生成一个数的时候预先处理,每生成一个数x,同时将3*x,5*x,7*x放入预备队列,生成下一个数的时候总是从预备队列里找出一个最小的

2016-08-05 12:21:04 1225

原创 链表的冒泡排序

由于链表的特殊性,只存在后向指针,所有的数只能向后移动,所以采用冒泡排序时先把最大的数交换到最后,然后第二大的数交换到倒数第二个结点上,注意每次交换的边界的更新。void ListSort(ListNode* pHead){ if(pHead == NULL) return; ListNode* pEnd; for(pEnd = pHead; pEnd != NULL; pE

2016-08-02 22:12:54 461

转载 最长回文字串-Manacher解法

对于一个比较长的字符串,O(n^2)的时间复杂度是难以接受的。Can we do better? 先来看看解法2存在的缺陷。1) 由于回文串长度的奇偶性造成了不同性质的对称轴位置,解法2要对两种情况分别处理;2) 很多子串被重复多次访问,造成较差的时间效率。缺陷2)可以通过这个直观的小

2016-08-01 19:37:42 492

原创 字符串之最

字符串里有一类问题经常遇到,就是最长问题。归纳为:最长公共子串、最长公共子序列、最长回文子串、最长重复子串、最长不重复子串问题。这一篇在这里做个总结,给出每个问题的解题思路。1.最长公共子串最长公共子串和最长公共子序列非常类似,但是子串要求在原字符串中是连续的。而最长公共子序列则并不要求连续。方法一:平移法:引用自博客http://blog.csdn.net/hackbuteer1/a

2016-07-31 11:13:54 503

原创 素数生成算法

素数生成问题,解法主要分为试除法和筛选法两种,筛选法里又有很多算法,这里各实现一种比较方便且容易理解的方法,用来生成1到n之间的素数。1.试除法bool IsPrime(int num){ if(num < 2) return false; if(num == 2) return true; if(num % 2 == 0) return fals

2016-07-30 21:13:25 2582

原创 交换整数的奇数位和偶数位

题目:编写程序,交换某个整数的奇数位和偶数位,使用指令越少越好。解法:这道题目解法有很多,比较简单的方法就是提取奇数位右移一位,再提取偶数位左移一位,这样正好错位,最后”位或“就可以了。提取奇数位可以用10101010这样的二进制数,提取偶数位用01010101。int SwapOddEvenBits(int num){ return ((num & 0xaaaaaaaa) >> 1)

2016-07-29 20:43:10 601

原创 C++位操作总结

总结一下位操作常用的几个技巧:1.获取判断某位是否是否为1.bool GetBit(int num, int i){ return ((num & (1 << i)) != 0);} 2.置位将某一位置为1。int SetBit(int num, int i){ return num | (1 << i);}3.清零将第某几位置为0。//第i位清

2016-07-29 20:00:43 682

原创 返回二叉树的镜像

题目:操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:二叉树的镜像定义:源二叉树8/ \6 10/ \ / \5 7 9 11镜像二叉树8/ \10 6/ \ / \11 9 7 5   这道问题其实很简单,原以为可以打出来一次运行成功。实际发现脱离编译器手写没有一点bug真的是有点难度,稍不注意代码就错了。这里

2016-07-29 10:56:53 421

转载 KMP算法详解

原文出处:http://billhoo.blog.51cto.com/2337751/411486/【KMP算法简介】          KMP算法是一种改进后的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。通过一个辅助函数实现跳过扫描不必要的目标串字符,以达到优化

2016-07-26 16:57:31 325

原创 二叉树判断子树问题

题目:你有两颗非常大的二叉树:T1,有几百万个结点;T2,有几百个结点。设计一个算法,判断T2是否为T1的子树。解法:二叉树中结点太多,遍历结点比较用递归的方法比较合适。如果刚开始根结点相同,就开始比较左右子结点是否相同(注意这个过程不是判断子树的过程,而是严格比较左右子结点是否相等,而不能再往下传递)。如果所有节点比较之后都相等,返回真。否则再去判断T1的左右子树是否包含T2,这一步是递归过

2016-07-26 11:01:07 1940

原创 二叉树两个结点的第一个共同祖先

题目:设计并实现一个算法,找出二叉树中某两个结点的第一个共同祖先。不得将额外的结点存储在另外的数据结构中。注意,这不一定是二叉查找树。解法:如果两个结点都在树中,且其中一个为根结点,那么直接返回根结点。接下来判断两个结点是否在根结点的同一个子树中,如果不同时在根结点的左子树或者右子树中,则根结点是第一个祖先,直接返回根结点。如果同在根结点的左子树中,递归判断两个结点在左子树中的第一个共同祖先。

2016-07-25 20:53:07 2575

原创 判断二叉树是否二叉查找树

题目:实现一个函数,检查一棵二叉树是否为二叉查找树。解法一:二叉树一个非常重要的特点的是它的中序遍历为递增序列,如果中序遍历递增,那么肯定是二叉查找树。中序遍历的结果可以保存在数组里面。void AddToArray(BinaryTreeNode* pRoot, int* array, int& size){ if(pRoot) { AddToArray(pRoot->m_pLe

2016-07-25 17:06:45 5099

原创 有序数组创建高度最小的二叉查找树

题目:给定一个整数数组,元素各不相同且按升序排列,编写一个算法,创建一个高度最小的二叉查找树。解法:二叉查找树的特点是根的左子树都比根结点小,右子树都比根结点大,左右子树结点数目相同时有望时树的高度最小。因此根结点可以取数组的中位数。左子结点为数组前半段的中位数,右子结点为数组后半段的中位数,递归过程实现,需要注意的是递归的终止条件。BinaryTreeNode* CreateCore(i

2016-07-25 11:40:01 1642

原创 判断二叉树是否平衡

题目:实现一个函数,检查二叉树是否平衡。在这个问题中,平衡树的定义如下:任意一个结点,其两个子树的高度差不超过1。解法一:因为要检查每个结点的高度,如果用循环遍历每个结点非常麻烦,所以想到用递归。先判断根结点两个子树的高度差,如果满足再分别判断根结点的两个子结点是否满足平衡。求结点的高度也可以用递归的方法。int GetHeight(BinaryTreeNode* pRoot){ if

2016-07-25 10:02:32 373

转载 C++ STL:list用法详解

list容器介绍相对于vector容器的连续线性空间,list是一个双向链表,它有一个重要性质:插入操作和删除操作都不会造成原有的list迭代器失效,每次插入或删除一个元素就配置或释放一个元素空间。也就是说,对于任何位置的元素插入或删除,list永远是常数时间。常用函数(1)    构造函数list c:创建一个空的listlist c1(c2):复制另一个同类型元素的list

2016-07-24 11:48:46 662

原创 二叉树的递归和非递归遍历方法

void myPrintTree(BinaryTreeNode* pRoot){ if(pRoot == NULL) return; BinaryTreeNode* pNode = pRoot; std::stack stackTreeNode; stackTreeNode.push(pNode); while(!stackTreeNode.empty()) {

2016-07-22 11:31:42 253

原创 按升序对栈进行排序

题目:编写程序,按升序对栈进行排序(即最大元素位于栈顶)。最多只能使用一个额外的栈存放临时数据,但不得将元素复制到别的数据结构(如数组)。    思路:假设数据保存在原栈s1中,另设辅助栈s2。数据进行一系列处理后以升序排在栈s1中,那么s1中的数据一定是由s2栈倾倒出的。所以在完成所有数据在s1中升序排列之前数据应该在s2中降序排列,即大元素位于栈底。所以问题转化为从s1中弹出元素输入到s2

2016-07-21 16:55:35 7047 2

原创 递归解决汉诺塔问题

题目:在经典问题汉诺塔中,有三根柱子及N个不同大小的穿孔圆盘,盘子可以任意滑入一根柱子。一开始,所有盘子自底向上从大到小一次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时有以下限制:(1)每次只能移动一个盘子;(2)盘子只能从柱子顶端滑出移动到下一根柱子;(3)盘子只能叠在比它大的盘子上。请运用栈,编写程序将所有盘子从第一根柱子移到最后一根柱子。

2016-07-20 10:43:58 660

原创 堆盘子问题

题目:设想有一堆盘子,堆太高可能会倒下来。因此,在现实生活中,盘子堆到一定高度时,我们就会另外堆一堆盘子。请实现数据结构SetOfStacks,模拟这种行为。SetOfStacks应该由多个栈组成,并且在前一个栈填满时新建一个栈。此外,SetOfStacks.push()和SetOfStacks.pop()应该与普通栈的操作方法相同(也就是说,pop()返回的值,应该跟只有一个栈时的情况一样)。

2016-07-19 20:17:39 591

原创 检查链表是否为回文

题目:编写一个函数,检查链表是否为回文。解法一:根据回文的定义,正向反向读取时一致,即为回文,因此可以将原链表反转再与原链表比较,完全一样就是回文。算法比较简单就不贴代码了。解法二:如果链表是回文,那么前半部分和后半部分一样,但是顺序相反。单链表没有前向指针,所以依靠指针只能在一个方向上比较。如果将链表的前半部分反序,就可以和后半部分比较了,反序可以用到数据结构栈。bool IsPal

2016-07-19 11:34:57 1141

转载 C++ STL--stack/queue 的使用方法

转自:http://www.cnblogs.com/mfryf/archive/2012/08/09/2629992.html1、stackstack 模板类的定义在头文件中。stack 模板类需要两个模板参数,一个是元素类型,一个容器类型,但只有元素类型是必要的,在不指定容器类型时,默认的容器类型为deque。定义stack 对象的示例代码如下:stack s1;

2016-07-19 10:55:59 293

原创 链表的十进制加法

题目:给定两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。示例 输入:(7->1->6) +(5->9->2),即617+295输出:2->1->9,即912。进阶 假设这些数位是正向存放的,请再做一遍。示例 输入:(6->1->7) + (2->9->5),即617+295.输出:9->

2016-07-18 21:40:00 1471

原创 链表分割问题

题目:编写代码,以给定的x为基准值将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前。解法一:交换结点法,回想学习快速排序的时候,也是以基准值将一组数划分成两部分,小于基准值的排在前面,大于基准值的排在后半部分。因此解决这个问题也可以使用两个指针。如果链表头结点开始遍历,第一个需要移动的结点是第一个大于或等于基准值的结点,例如链表1->3->6->7->2->1->5,基准值设为4

2016-07-18 10:54:34 341

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除