- 博客(30)
- 收藏
- 关注
转载 shell脚本八种字符串截取方法
Linux 的字符串截取很有用。有八种方法。假设有变量 var=http://www.aaa.com/123.htm.1. # 号截取,删除左边字符,保留右边字符。echo ${var#*//}其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符即删除 http://结果是 :www.aaa.com/123.ht
2017-08-10 14:43:22 363
转载 crond和crontab详解
一、crontab是什么? 1. 定时任务软件种类 at 适合仅执行一次就结束的调度命令,需要启动一个后端的atd服务。 crontab 需要启动一个服务crond才行,crond服务通过crontab命令实现 anacron 无法周期性执行,只能以天为周期,但有个特点,在关机状态下未>执行的任务,下次开机时可以补上执行注:crontab为最常用的
2017-08-10 14:09:57 386
原创 链表翻转(按K个一组)
题目:链表翻转。给出一个链表和一个数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个一组分成若干组。递归翻转,先翻转最后一组,依次向前翻转。不好理解的地方在于,每一组翻转后怎么衔接。其实跳出递归后,表示后面的节点已经
2017-07-25 13:03:43 3593 1
原创 链表逆置
题目:给出一个链表和一个数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)
2017-07-25 11:18:50 2925
原创 求数组中出现次数超过一半的数字
题目:一个数组中有一个数字的次数超过了数组的一半,求出这个字符。如:int a[]={2,3,2,2,2,2,2,5,4,1,2,3},求出超过一半的数字是2 由题目可知,这个数字出现的次数,比其他所有数字出现次数之和还要大,所以在遍历时可以保存两个值,一个是里面的数字,一个是出现的次数。情况:1)如果下一个数字和保存的数字相同,次数加12)如果下一个数字和保存的数字不
2017-07-23 23:15:06 408
原创 求二叉树叶子节点的个数/求二叉树第k层的节点个数。
题目:求二叉树叶子节点的个数/求二叉树第k层的节点个数。这两个题的方法是一样的,用递归就可以求解1.叶子节点:1)当前节点为NULL,返回02)没有左右孩子,返回13)否则返回左孩子的叶子节点个数加上右孩子的叶子节点个数size_t BinaryTree::_GetLeefNode(Node* pRoot){ if (NULL == pRoot) return 0;
2017-07-23 19:43:24 1169
原创 求N!末尾0的个数
题目:给定一个整数N,那么N的阶乘N!末尾有多少个0呢?例如:N=10,N!=3 628 800,N!的末尾有两个0。方法一:最容易想到的方法,先把N的阶乘求出来,再用一个函数计算末尾0的个数,但是这个方法有两个问题:当数字很大时,效率很差、用内置类型(int、long等)会溢出。要解决这两个问题,只能优化算法。首先要知道N的阶乘一定可以用K×10M来表示,那我们的问题就变成了
2017-07-23 13:54:19 1949
原创 二进制中1的个数
题目:计算一个整数二进制位中1的个数。要求效率尽可能的高。且能正确求正数和负数的二进制中1的个数。可能首先想到的是用这个数&1,然后每次右移一位。这样有一个致命的问题就是,计算负数时,因为右移最高位会补1,最后会变成0xFFFFFFFF陷入死循环。而且即使是正数,效率也不是很高。要解决这个问题,可以不移动参数,而移动1,即每次让1左移一位,判断当前位置是否为1,但是效率同样很低,为
2017-07-23 01:22:20 271
原创 查找一个字符串中第一个只出现两次的字符
题目:查找一个字符串中第一个只出现两次的字符。比如:“abcdefabcdefabc”中第一个只出现两次为‘d’,要求时间复杂度为O(N),空间复杂度为O(1)思路:创建一个辅助数组(大小为256),数组的下标表示字符的ASCII码,遍历字符串,每出现一个,在对应位置加一,最后遍历数组就可以找到第一个出现两次的字符代码:charfind_char_ins
2017-07-20 00:46:09 788
原创 实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)
题目:实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1) 方法一:用一个栈,每次入栈push两个数(第一个是要入栈的,第二个就是当前最小值),出栈时也出两个这样栈顶元素就是最小值,代码如下:classStack{public: voidpush(intvalue
2017-07-20 00:10:57 1030
原创 Linux下用Shell模拟进度条
之前用c语言模拟过进度条,学了shell发现同样可以写出 #!/bin/bashi=0bar=''lable=('|' '/' '-' '\\')index=0while [ $i -le 100 ]do printf "[%-100s][%d%%][%c]\r" "$bar" "$i" "${lable[$index]}" bar='#'$bar let i++ let
2017-07-04 16:53:18 396
转载 Shell中反引号和$()的区别
Shell中可以用来实现变量代换的命令有两种,一种是由反引号括起来的一条命令另一种是由$()括起来一条命令,shell先执行这条命令,然后见输出结果立刻代换到当前命令行中。 例如定义一个变量存放date命令的输出: $DATE=`data` $echo $DATE 命令代换也可以用$()表示:$DATE=$(date) 输出的效果是一样的。我们知道系统是不会存在冗
2017-06-28 08:48:59 297
转载 linux- epoll
epoll - I/O event notification facility在linux的网络编程中,很长的时间都在使用select来做事件触发。在linux新的内核中,有了一种替换它的机制,就是epoll。相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。并且
2017-06-28 08:44:41 171
原创 Linux高性能服务器之多路转接(2)---poll模型
#include #include #include #include #include #include #include #include #include #include #include #define POLLFD_SIZE 1024 /* struct pollfd 结构体数组最大上限 */ str
2017-06-14 17:26:58 173
原创 Linux高性能服务器之多路转接(1)----select模型实现
什么是多路转接 如何用select模型搭建高性能服务器(select基本使用) select和多线程各有什么优缺点
2017-06-12 18:18:56 446
转载 Linux下线程池的实现
什么时候需要创建线程池呢?简单的说,如果一个应用需要频繁的创建和销毁线程,而任务执行的时间又非常短,这样线程创建和销毁的带来的开销就不容忽视,这时也是线程池该出场的机会了。如果线程创建和销毁时间相比任务执行时间可以忽略不计,则没有必要使用线程池了。 下面是Linux系统下用C语言创建的一个线程池。线程池会维护一个任务链表(每个CThread_worker结构就是一个任务)。
2017-06-03 17:03:14 317
原创 可重入函数和线程安全的对比
线程安全一般说来,一个函数被称为线程安全的,当且仅当被多个并发线程反复调用时,它会一直产生正确的结果。 要保证线程安全,重点是保护共享资源,如全局变量、静态局部变量。为了解释线程安全,可以模拟实现一个sleep函数。#include #include #include void handler(int sig)//信号捕捉处理函数{ printf("i am handler
2017-04-29 08:53:41 310
原创 [编程题]循环单词
如果一个单词通过循环右移获得的单词,我们称这些单词都为一种循环单词。 例如:picture 和 turepic 就是属于同一种循环单词。 现在给出n个单词,需要统计这个n个单词中有多少种循环单词。
2017-04-06 23:29:41 1492
原创 【编程题】好多鱼!--大鱼吃小鱼问题
牛牛有一个鱼缸。鱼缸里面已经有n条鱼,每条鱼的大小为fishSize[i] (1 ≤ i ≤ n,均为正整数),牛牛现在想把新捕捉的鱼放入鱼缸。鱼缸内存在着大鱼吃小鱼的定律。经过观察,牛牛发现一条鱼A的大小为另外一条鱼B大小的2倍到10倍(包括2倍大小和10倍大小),鱼A会吃掉鱼B。考虑到这个,牛牛要放入的鱼就需要保证: 1、放进去的鱼是安全的,不会被其他鱼吃掉 2、这条鱼放进去也不能吃掉其
2017-04-06 23:27:44 2341
原创 浅谈大端模式和小端模式
什么是大端和小端1) Little-Endian(小端)就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。2) Big-Endian(大端)就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。举一个例子,比如数字0x12 34 56 78在内存中的表示形式为:可见,大端模式和字符串的存储模式类似。大小端各自的优点
2017-04-04 17:08:27 4739
原创 关于struct的内存对齐问题
内存对齐1. 成员对齐:对于结构体的每个成员,起始地址的偏移量必须为该变量类型所占字节的整数倍。2. 结构体对齐:结构体中占字节最多的成员叫边界成员,整个结构体所用空间必须是边界成员所占字节的整数倍。3. 编译器的对齐指令:通常不需要我们考虑对齐方式问题,编译器会自动选择合适的策略,但也可以通过命令设置: *#pragma pack(n)* 可以设定变量以n字节方式对
2017-04-04 16:16:18 692
转载 常见的进程调度算法
先来先服务 (FCFS,first come first served) 在所有调度算法中,最简单的是非抢占式的FCFS算法。 算法原理:进程按照它们请求CPU的顺序使用CPU.就像你买东西去排队,谁第一个排,谁就先被执行,在它执行的过程中,不会中断它。当其他人也想进入内存被执行,就要排队等着,如果在执行过程中出现一些事,他现在不想排队了,下一个排队的就补上。此时如果他又想排队了,只能站到
2017-02-18 22:22:34 325
转载 Linux进程描述符task_struct
1. 进程状态(State)进程执行时,它会根据具体情况改变状态 。进程状态是调度和对换的依据。Linux中的进程主要有如下状态,如表4.1所示。 内核表示含义TASK_RUNNING可运行TASK_INTERRUPTIBLE可中断的等待状态TASK_UNINTERRUPTI
2017-02-18 22:05:31 285
原创 linux下find命令基本用法
-name 按文件名查找*代表任意字符-perm 按权限查找权限相同的文件太多,此处将file2权限修改为000方便查找-user 按拥有者查找-group 按所属组查找-mtime +n -n按照修改时间查找-n 为n天之内+n为n天以前
2017-02-15 23:01:32 506
原创 linux下Access、Modify、Change时间的查看和修改
Access 意思是“访问”。当编辑器打开文件时,使用cat,more,less,grep,sed读取文件内容将会刷新Access的时间,使用ls -lu可以读取当前的Access时间Modify 意思是“更改(内容)“,或者“写入”。当更改了一个文件的内容的时候,此文件的modify的时间记录会被更新。用ls -l看到的文件时间是最近一次modify的时间。Change
2017-02-15 13:17:06 1514
原创 有趣的死循环
int main(){ int i , arr[10]; //先定义了i先分配 int sz = sizeof(arr)/sizeof(arr[0]); for(i = 0; i<= sz; i++) //越界访问 { printf("%d",i); a[i] = 0; } return 0;}看似没问题的程序却陷入
2016-07-23 14:06:13 349
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人