<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[element137的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/element137</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; element137]]></copyright><item><title><![CDATA[shell脚本八种字符串截取方法]]></title><link>https://blog.youkuaiyun.com/element137/article/details/77050840</link><guid>https://blog.youkuaiyun.com/element137/article/details/77050840</guid><author>element137</author><pubDate>Thu, 10 Aug 2017 14:43:22 +0800</pubDate><description><![CDATA[Linux 的字符串截取很有用。有八种方法。

假设有变量 var=http://www.aaa.com/123.htm.

1. # 号截取，删除左边字符，保留右边字符。

echo ${var#*//}

其中 var 是变量名，# 号是运算符，*// 表示从左边开始删除第一个 // 号及左边的所有字符
即删除 http://
结果是 ：www.aaa.com/123.ht]]></description><category></category></item><item><title><![CDATA[crond和crontab详解]]></title><link>https://blog.youkuaiyun.com/element137/article/details/77049917</link><guid>https://blog.youkuaiyun.com/element137/article/details/77049917</guid><author>element137</author><pubDate>Thu, 10 Aug 2017 14:09:57 +0800</pubDate><description><![CDATA[一、crontab是什么？

　　1. 定时任务软件种类　　　　

at 　　　适合仅执行一次就结束的调度命令，需要启动一个后端的atd服务。 
crontab　需要启动一个服务crond才行，crond服务通过crontab命令实现 
anacron　无法周期性执行，只能以天为周期，但有个特点，在关机状态下未>执行的任务，下次开机时可以补上执行


注：crontab为最常用的]]></description><category></category></item><item><title><![CDATA[链表翻转（按K个一组）]]></title><link>https://blog.youkuaiyun.com/element137/article/details/76059650</link><guid>https://blog.youkuaiyun.com/element137/article/details/76059650</guid><author>element137</author><pubDate>Tue, 25 Jul 2017 13:03:43 +0800</pubDate><description><![CDATA[题目：链表翻转。给出一个链表和一个数k，比如链表1→2→3→4→5→6，k=2，翻转后2→1→4→3→6→5，若k=3,翻转后3→2→1→6→5→4，若k=4，翻转后4→3→2→1→5→6


分析：
这个题是链表逆置的升级版。重点是，把整个链表按照每K个一组分成若干组。递归翻转，先翻转最后一组，依次向前翻转。
不好理解的地方在于，每一组翻转后怎么衔接。其实跳出递归后，表示后面的节点已经]]></description><category></category></item><item><title><![CDATA[链表逆置]]></title><link>https://blog.youkuaiyun.com/element137/article/details/76060496</link><guid>https://blog.youkuaiyun.com/element137/article/details/76060496</guid><author>element137</author><pubDate>Tue, 25 Jul 2017 11:18:50 +0800</pubDate><description><![CDATA[题目：给出一个链表和一个数k，比如链表1→2→3→4→5→6，逆置后6→5→4→3→2→1


分析：
因为单链表只能找到next节点，不能找到prev节点，所以必须借助辅助指针来保存原来链表的状态。


我们可以把过程分成下面几步：
1）pNext 保存 pHead->next 2）pHead->next 指向 pPre 3）pPre 指向 pHead保存原来的上一个节点  4）]]></description><category></category></item><item><title><![CDATA[求数组中出现次数超过一半的数字]]></title><link>https://blog.youkuaiyun.com/element137/article/details/75947686</link><guid>https://blog.youkuaiyun.com/element137/article/details/75947686</guid><author>element137</author><pubDate>Sun, 23 Jul 2017 23:15:06 +0800</pubDate><description><![CDATA[题目：一个数组中有一个数字的次数超过了数组的一半，求出这个字符。如：int a[]={2,3,2,2,2,2,2,5,4,1,2,3}，求出超过一半的数字是2


 
由题目可知，这个数字出现的次数，比其他所有数字出现次数之和还要大，所以在遍历时可以保存两个值，一个是里面的数字，一个是出现的次数。
情况：
1）如果下一个数字和保存的数字相同，次数加1
2）如果下一个数字和保存的数字不]]></description><category></category></item><item><title><![CDATA[求二叉树叶子节点的个数/求二叉树第k层的节点个数。]]></title><link>https://blog.youkuaiyun.com/element137/article/details/75947617</link><guid>https://blog.youkuaiyun.com/element137/article/details/75947617</guid><author>element137</author><pubDate>Sun, 23 Jul 2017 19:43:24 +0800</pubDate><description><![CDATA[题目：求二叉树叶子节点的个数/求二叉树第k层的节点个数。
这两个题的方法是一样的，用递归就可以求解
1.叶子节点：
1）当前节点为NULL，返回0
2）没有左右孩子，返回1
3）否则返回左孩子的叶子节点个数加上右孩子的叶子节点个数
size_t BinaryTree::_GetLeefNode(Node* pRoot)
{
	if (NULL == pRoot)
		return 0;]]></description><category></category></item><item><title><![CDATA[求N!末尾0的个数]]></title><link>https://blog.youkuaiyun.com/element137/article/details/75902537</link><guid>https://blog.youkuaiyun.com/element137/article/details/75902537</guid><author>element137</author><pubDate>Sun, 23 Jul 2017 13:54:19 +0800</pubDate><description><![CDATA[题目：给定一个整数N，那么N的阶乘N！末尾有多少个0呢？例如：N＝10，N！＝3 628 800，N！的末尾有两个0。


方法一：
最容易想到的方法，先把N的阶乘求出来，再用一个函数计算末尾0的个数，但是这个方法有两个问题：当数字很大时，效率很差、用内置类型（int、long等）会溢出。要解决这两个问题，只能优化算法。
首先要知道N的阶乘一定可以用K×10M来表示，那我们的问题就变成了]]></description><category></category></item><item><title><![CDATA[二进制中1的个数]]></title><link>https://blog.youkuaiyun.com/element137/article/details/75809984</link><guid>https://blog.youkuaiyun.com/element137/article/details/75809984</guid><author>element137</author><pubDate>Sun, 23 Jul 2017 01:22:20 +0800</pubDate><description><![CDATA[题目：计算一个整数二进制位中1的个数。要求效率尽可能的高。且能正确求正数和负数的二进制中1的个数。


可能首先想到的是用这个数&1，然后每次右移一位。这样有一个致命的问题就是，计算负数时，因为右移最高位会补1，最后会变成0xFFFFFFFF陷入死循环。而且即使是正数，效率也不是很高。
要解决这个问题，可以不移动参数，而移动1，即每次让1左移一位，判断当前位置是否为1，但是效率同样很低，为]]></description><category></category></item><item><title><![CDATA[数据结构每日一题]]></title><link>https://blog.youkuaiyun.com/element137/article/details/75808833</link><guid>https://blog.youkuaiyun.com/element137/article/details/75808833</guid><author>element137</author><pubDate>Sun, 23 Jul 2017 00:23:34 +0800</pubDate><description><![CDATA[练习题合集]]></description><category></category></item><item><title><![CDATA[检验入栈序列、出栈序列是否合法]]></title><link>https://blog.youkuaiyun.com/element137/article/details/75808799</link><guid>https://blog.youkuaiyun.com/element137/article/details/75808799</guid><author>element137</author><pubDate>Sun, 23 Jul 2017 00:19:52 +0800</pubDate><description><![CDATA[检验入栈序列、出栈序列是否合法]]></description><category></category></item><item><title><![CDATA[查找一个字符串中第一个只出现两次的字符]]></title><link>https://blog.youkuaiyun.com/element137/article/details/75453288</link><guid>https://blog.youkuaiyun.com/element137/article/details/75453288</guid><author>element137</author><pubDate>Thu, 20 Jul 2017 00:46:09 +0800</pubDate><description><![CDATA[题目：查找一个字符串中第一个只出现两次的字符。比如：“abcdefabcdefabc”中第一个只出现两次为‘d’，要求时间复杂度为O(N)，空间复杂度为O(1)


思路：
创建一个辅助数组（大小为256），数组的下标表示字符的ASCII码，遍历字符串，每出现一个，在对应位置加一，最后遍历数组就可以找到第一个出现两次的字符


代码：


char
find_char_ins]]></description><category></category></item><item><title><![CDATA[实现一个栈,要求实现Push（出栈）、Pop（入栈）、Min（返回最小值的操作）的时间复杂度为O(1)]]></title><link>https://blog.youkuaiyun.com/element137/article/details/75453171</link><guid>https://blog.youkuaiyun.com/element137/article/details/75453171</guid><author>element137</author><pubDate>Thu, 20 Jul 2017 00:10:57 +0800</pubDate><description><![CDATA[题目：实现一个栈Stack，要求实现Push（出栈）、Pop（入栈）、Min（返回最小值的操作）的时间复杂度为O(1) 


方法一：
用一个栈，每次入栈push两个数（第一个是要入栈的，第二个就是当前最小值），出栈时也出两个
这样栈顶元素就是最小值，代码如下：





class
Stack
{
public:
     void
push(int
value]]></description><category></category></item><item><title><![CDATA[Linux下用Shell模拟进度条]]></title><link>https://blog.youkuaiyun.com/element137/article/details/74332629</link><guid>https://blog.youkuaiyun.com/element137/article/details/74332629</guid><author>element137</author><pubDate>Tue, 04 Jul 2017 16:53:18 +0800</pubDate><description><![CDATA[之前用c语言模拟过进度条，学了shell发现同样可以写出 
#!/bin/bash

i=0
bar=''
lable=('|' '/' '-' '\\')
index=0
while [ $i -le 100 ]
do
	printf "[%-100s][%d%%][%c]\r" "$bar" "$i" "${lable[$index]}"
	bar='#'$bar
	let i++
	let]]></description><category></category></item><item><title><![CDATA[Shell中反引号和$()的区别]]></title><link>https://blog.youkuaiyun.com/element137/article/details/73825854</link><guid>https://blog.youkuaiyun.com/element137/article/details/73825854</guid><author>element137</author><pubDate>Wed, 28 Jun 2017 08:48:59 +0800</pubDate><description><![CDATA[Shell中可以用来实现变量代换的命令有两种，一种是由反引号括起来的一条命令另一种是由$()括起来一条命令，shell先执行这条命令，然后见输出结果立刻代换到当前命令行中。
　　例如定义一个变量存放date命令的输出：
　　　　$DATE=`data`
　　　　$echo $DATE
　　命令代换也可以用$()表示：$DATE=$(date)  输出的效果是一样的。我们知道系统是不会存在冗]]></description><category></category></item><item><title><![CDATA[linux- epoll]]></title><link>https://blog.youkuaiyun.com/element137/article/details/73825834</link><guid>https://blog.youkuaiyun.com/element137/article/details/73825834</guid><author>element137</author><pubDate>Wed, 28 Jun 2017 08:44:41 +0800</pubDate><description><![CDATA[epoll - I/O event notification facility

在linux的网络编程中，很长的时间都在使用select来做事件触发。在linux新的内核中，有了一种替换它的机制，就是epoll。
相比于select，epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中，它是采用轮询来处理的，轮询的fd数目越多，自然耗时越多。并且]]></description><category></category></item><item><title><![CDATA[Linux高性能服务器之多路转接（2）---poll模型]]></title><link>https://blog.youkuaiyun.com/element137/article/details/73250444</link><guid>https://blog.youkuaiyun.com/element137/article/details/73250444</guid><author>element137</author><pubDate>Wed, 14 Jun 2017 17:26:58 +0800</pubDate><description><![CDATA[#include   
#include   
#include   
#include   
#include   
#include   
#include    
#include   
#include   
#include   
#include   
  
#define POLLFD_SIZE 1024 /* struct pollfd 结构体数组最大上限 */  
  

str]]></description><category></category></item><item><title><![CDATA[Linux高性能服务器之多路转接（1）----select模型实现]]></title><link>https://blog.youkuaiyun.com/element137/article/details/73131921</link><guid>https://blog.youkuaiyun.com/element137/article/details/73131921</guid><author>element137</author><pubDate>Mon, 12 Jun 2017 18:18:56 +0800</pubDate><description><![CDATA[什么是多路转接
		如何用select模型搭建高性能服务器（select基本使用）
		select和多线程各有什么优缺点]]></description><category></category></item><item><title><![CDATA[Linux下线程池的实现]]></title><link>https://blog.youkuaiyun.com/element137/article/details/72853116</link><guid>https://blog.youkuaiyun.com/element137/article/details/72853116</guid><author>element137</author><pubDate>Sat, 03 Jun 2017 17:03:14 +0800</pubDate><description><![CDATA[什么时候需要创建线程池呢？简单的说，如果一个应用需要频繁的创建和销毁线程，而任务执行的时间又非常短，这样线程创建和销毁的带来的开销就不容忽视，这时也是线程池该出场的机会了。如果线程创建和销毁时间相比任务执行时间可以忽略不计，则没有必要使用线程池了。

    下面是Linux系统下用C语言创建的一个线程池。线程池会维护一个任务链表(每个CThread_worker结构就是一个任务)。
   ]]></description><category></category></item><item><title><![CDATA[可重入函数和线程安全的对比]]></title><link>https://blog.youkuaiyun.com/element137/article/details/70943614</link><guid>https://blog.youkuaiyun.com/element137/article/details/70943614</guid><author>element137</author><pubDate>Sat, 29 Apr 2017 08:53:41 +0800</pubDate><description><![CDATA[线程安全
一般说来，一个函数被称为线程安全的，当且仅当被多个并发线程反复调用时，它会一直产生正确的结果。 
要保证线程安全，重点是保护共享资源，如全局变量、静态局部变量。为了解释线程安全，可以模拟实现一个sleep函数。
#include 
#include 
#include 

void handler(int sig)//信号捕捉处理函数
{
	printf("i am handler]]></description><category></category></item><item><title><![CDATA[[编程题]循环单词]]></title><link>https://blog.youkuaiyun.com/element137/article/details/69488501</link><guid>https://blog.youkuaiyun.com/element137/article/details/69488501</guid><author>element137</author><pubDate>Thu, 06 Apr 2017 23:29:41 +0800</pubDate><description><![CDATA[如果一个单词通过循环右移获得的单词，我们称这些单词都为一种循环单词。 例如：picture 和 turepic 就是属于同一种循环单词。 现在给出n个单词，需要统计这个n个单词中有多少种循环单词。]]></description><category></category></item></channel></rss>