自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

NK_test的博客

大部分人愿意做任何事来逃避真正的思考

  • 博客(28)
  • 资源 (2)
  • 问答 (5)
  • 收藏
  • 关注

原创 C++ Primer 学习笔记与思考_11 try..catch语句及相关疑点

在一个小的程序中,可以用比较简单的方法处理异常,例如用if语句判别除数是否为0,如果是0,则输出一个出错信息。但是在一个大的系统中,包含很多模块,每个模块又包含许多类和函数,函数之间又互相调用,比较复杂。如果在每一个函数中都设置处理异常的程序段,会使程序过于庞大和复杂。因此c++采用的办法是:如果在执行一个函数过程中出现异常,可以不在本函数中立即处理,而是发出一个信息,传给他的上一级(即调用他的函

2015-09-29 22:26:04 1286

原创 [leetcode] 134 Gas Station(经典dp || 贪心)

(一)最容易想到的是O(n2)的解法预处理出gas[i] - cost[i] 的数组,从每个非负的位置开始尝试,只要能够完成一个循环,就可以输出结果;对于返回-1的情况,我们经过思考和推论可以得出:对于一个循环数组,如果这个数组整体和 SUM >= 0,那么必然可以在数组中找到这么一个元素:从这个数组元素出发,绕数组一圈,能保证累加和一直是出于非负状态。所以只需要比较sum和0的大小就

2015-09-28 14:31:51 2945

原创 [leetcode] 136 &137 Single Number Ⅰ Ⅱ

136;题意很简单,给你一个数组(int),只有一个数字是出现一次的,其余出现两次,不允许使用额外空间,时间复杂度线性。如果允许使用额外空间的话,可以使用map记录次数,最后遍历,也是O(n)的复杂度;但是现在需要把额外空间也去掉,我们只能向位操作方面想了。利用异或的特点,可以发现 (1) a^a =0(2) 0^ b=b所以,相同的两个数异或结果肯定是0,而0与唯一的出现

2015-09-25 00:00:09 1719

原创 Linux进程间通信(IPC)编程实践(二) FIFO命名管道

在前一篇文章中,我们讲解了如何使用匿名管道来在进程之间传递数据,同时也看到了这个方式的一个缺陷,就是这些进程都由一个共同的祖先进程启动,这给我们在不相关的的进程之间交换数据带来了不方便。这里将会介绍进程的另一种通信方式——命名管道,来解决不相关进程间的通信问题。什么是命名管道    命名管道也被称为FIFO文件,它是一种特殊类型的文件,它在文件系统中以文件名的形式存在,但是它的行为却和

2015-09-23 12:18:21 2245 1

原创 [leetcode] 152 Maximum Product Subarray

先来一个比较简单的题目,也是出现较多的,求连续的最大子数组和,见hdu 1003.比较简单的动态规划,如果当前的连续和小于0时,再加则一定会小于nums[i]的当前值,此时应该取nums[i].#include#includeusing namespace std;int a[100001];int sum[100001];int main(){ int n;

2015-09-22 23:54:39 3921

原创 Linux进程间通信(IPC)编程实践(一) 基本概念和匿名管道

进程间通信至少可以通过传送打开文件来实现,不同的进程通过一个或多个文件来传递信息,事实上,在很多应用系统里,都使用了这种方法。但一般说来, 进程间通信(IPC:InterProcess Communication)不包括这种似乎比较低级的通信方法。Unix系统中实现进程间通信的方法很多,而且不幸的是,极少方法能在所有的Unix系 统中进行移植(唯一一种是半双工的管道,这也是最原始的一种通信方式

2015-09-22 22:12:34 2906

原创 [Leetcode] 11 Container With Most Water

首先,刚看到这道题的时候,我是往动态规划方向去想的,后来构造不出转移方程。所以再次进行思考,想按照三种方式取最大值即:1)right左移一位2)Left右移一位3)Right左移一位,left右移一位三者取最大值,但是不能证明局部最优可以带来全局最优,而且找到了反例。我们试想如果为了局部最优而导致左右均接近一位的话,有可能错过一个最大高度。那么我们如何才能不错过最大高度呢?只需

2015-09-18 15:22:35 1594

原创 Linux信号编程实践(三) 信号在内核中的表示(sigaction&sigqueue)

信号在内核中的表示    实际执行信号的处理动作称为信号递达(Delivery),信号从产生到递达之间的状态,称为信号未决(Pending)。进程可以选择阻塞(Block)某个信号。被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作。注意,阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作。信号在内核中的表示可以看作是这样的:

2015-09-17 22:29:41 3496

原创 Linux信号编程实践(二) 信号发送函数和可重入函数

在早期的UNIX中信号是不可靠的,不可靠在这里指的是:信号可能丢失,一个信号发生了,但进程却可能一直不知道这一点。现在Linux 在SIGRTMIN实时信号之前的都叫不可靠信号,这里的不可靠主要是不支持信号队列,就是当多个信号发生在进程中的时候(收到信号的速度超过进程处理的速度的时候),这些没来的及处理的信号就会被丢掉,仅仅留下一个信号。可靠信号是多个信号发送到进程的时候(收到信号

2015-09-17 18:42:35 2730

原创 Linux信号编程实践(一) 信号概述

中断    中断是系统对于异步事件的响应, 进程执行代码的过程中可以随时被打断,然后去执行异常处理程序;    计算机系统的中断场景:中断源发出中断信号 -> CPU判断中断是否屏蔽以及保护现场 -> CPU(查询中断向量表, 找到中断服务程序的入口地址)执行中断处理程序 ->(处理完中断之后) ->恢复现场,继续执行原来的任务中断分类硬件中断(外部中断

2015-09-15 20:59:51 1866

原创 Linux进程理解与实践(五)细谈守护进程

一. 守护进程及其特性     守护进程最重要的特性是后台运行。在这一点上DOS下的常驻内存程序TSR与之相似。其次,守护进程必须与其运行前的环境隔离开来。这些环境包括未关闭的文件描述符,控制终端,会话和进程组,工作目录以及文件创建掩模等。这些环境通常是守护进程从执行它的父进程(特别是shell)中继承下来的。最后,守护进程的启动方式有其特殊之处。它可以在Linux系统启动时从启动脚本/etc

2015-09-14 19:26:13 3190

原创 [leetcode] 139 Word Break

这题可以用DFS做,但是更好的方法是使用DP,这种类型的DP感觉还是接触的稍微有些少。题目中只要求源串分出来的词只要都在字典里就好,所以我们可以用dp[i] 表示源串的前i个字符可以满足分割,那么 dp[ j ] 满足分割的条件是存在k (0class Solution {public: bool wordBreak(string s, unordered_set& word

2015-09-13 23:32:19 2255

原创 Linux进程理解与实践(四)wait函数处理僵尸进程

Wait的背景   当子进程退出的时候,内核会向父进程发送SIGCHLD信号,子进程的退出是个异步事件(子进程可以在父进程运行的任何时刻终止)   子进程退出时,内核将子进程置为僵尸状态,这个进程称为僵尸进程,它只保留最小的一些内核数据结构,以便父进程查询子进程的退出状态。   父进程查询子进程的退出状态可以用wait/waitpid函数#include #i

2015-09-13 15:52:20 2445

原创 [leetcode] 179 Largest Number

拿到这个题的第一个想法是 将int转换成string,然后按照string的比较规则,但是发现  13那么何不我们直接比较下两者的组合,取其较大的呢,由此自定义优先级比较即可。注意处理全是0的情况,只输出一个0即可。class Solution {public: static bool comp(string s1,string s2) { retur

2015-09-12 12:24:02 2086

原创 [leetcode] 187 Repeated DNA Sequences

(一)最一开始的做法是使用 map 记录每个10个字符的字符串的个数,超过2就push_back进ans。但是MLE了,说明采用string并不是一个好方法。下面是MLE的代码:class Solution {public: vector findRepeatedDnaSequences(string s) { vector ans; map mp;

2015-09-12 00:10:51 2685

原创 Linux进程理解与实践(三)进程终止函数和exec函数族的使用

进程的几种终止方式(Termination)(1)正常退出   从main函数返回[return]   调用exit   调用_exit或者_Exit   最后一个线程从其启动处返回   从最后一个线程调用pthread_exit (最后两点见后面博客)(2)异常退出   调用abort   产生SIGABOUT信号   由信

2015-09-09 23:55:31 2558

原创 主项定理Master Method 计算时间复杂度

在面试题目中有一部分是让大家求时间复杂度的问题,例如给出我们: T(n) = a * T(n/b) + f(n)   (a ³ 1,b > 1,f(n)一般是个简单函数)这样的递归方程,计算其时间复杂度。这时可以有2种方法,来计算时间复杂度。一是用递归树,逐层代入原式,最终形成一个级数,然后用一个函数来表达,得到T(n)。(我们这里主要讨论第二种方法,递归树详见   http://ww

2015-09-09 20:49:35 7662

原创 [leetcode] 209 Minimum Size Subarray Sum

(一)O(logN)的解法首先将原数组处理成前项和的形式,这样就保证了数组的有序(注意第一个是0,自己push进去),然后遍历数组,寻找小于等于sum[i]+s的最小的下标,如果找不到,那么break结束。否则继续下去,最后取最小值。class Solution {public: int minSubArrayLen(int s, vector& nums) { vec

2015-09-08 23:37:16 3258

原创 手把手教你写基于C++ Winsock的图片下载的网络爬虫

先来说一下主要的技术点:1. 输入起始网址,使用ssacnf函数解析出主机号和路径(仅处理http协议网址)2. 使用socket套接字连接服务器,,获取网页html代码(使用http协议的GET请求),然后使用正则表达式解析出图片url和其他的url。3. 下载图片至创建的文件夹中,同时其他的url push进队列。4. 为了使爬虫能够连续的工作,这里使用了BFS宽度优先搜索,也

2015-09-07 23:48:29 11004 10

原创 Bestcoder #54(hdu 5427&5428&5429&5430)

hdu 5427 简单的排序。取后四位作为年份,按照年份由大到小排序,输出时注意不要把中间的空格输出就ok。#include #include #include #include using namespace std;struct node{ string age; int year;}N[200];bool comp(node a,node b){

2015-09-06 21:26:38 1115

原创 Linux进程理解与实践(二)僵尸&孤儿进程 和文件共享

孤儿进程与僵尸进程孤儿进程:   如果父进程先退出,子进程还没退出那么子进程的父进程将变为init进程。(注:任何一个进程都必须有父进程)#include #include #include #include int main(){ pid_t pid; //创建一个进程 pid = fork(); //创建失败 if (pid

2015-09-06 17:13:49 1576

原创 Linux进程理解与实践(一)基本概念和编程概述(fork,vfork,cow)

进程 and 程序什么是程序?   程序是完成特定任务的一系列指令集合。什么是进程?  [1]从用户的角度来看:进程是程序的一次执行过程  [2]从操作系统的核心来看:进程是操作系统分配的内存、CPU时间片等资源的基本单位。   [3]进程是资源分配的最小单位  [4]每一个进程都有自己独立的地址空间与执行状态。  [5]像UNIX这

2015-09-06 13:34:52 2333 1

原创 Linux下编程------文件与IO(三) 文件共享和fcntl函数

文件共享一个进程打开了两个文件文件表条目(file-table-entry):   1.文件状态标志(file-status-flags): 读/写/追加/同步/非阻塞等;   2.当前文件偏移量   3.v节点指针[cpp] view plaincopy//验证  int

2015-09-05 10:38:17 30821 10

原创 Linux下编程-----文件与IO(二)stat函数

功能:获取文件元数据[cpp] view plaincopy#include   #include   #include   int stat(const char *path, struct stat *buf);  int fstat(int fd, struct stat *buf);  int lstat(cons

2015-09-04 22:49:13 2322

原创 [leetcode] 211 Add and Search Word - Data structure design

因为给定了a-z这个范围,并且字符串的添加和查找符合Trie的常用方法,因此考虑使用Trie这种数据结构。然后和普通的Trie不同的是,要匹配正则表达式中的“.”,也就是说在这一层是无法判断沿着拿个结点向下走的,所以要循环这一层的结点,只有这一层所有结果失败后才能返回false,剩下的递推。所以我们采取Trie+回溯法。代码中的searchHelp函数是专门用于回溯的,要求会回溯的掌握比较

2015-09-04 01:06:29 1766

原创 Linux下编程-----文件与IO(一)基本API

I/O是什么输入/输出是内存和外设之间拷贝数据的过程:   设备->内存: 输入操作   内存->设备: 输出操作 高级I/O: ANSI C提供的标准I/O库函数成为高级I/O, 也称为带缓冲的I/O; 低级I/O: Linux 提供的系统调用, 通常也称为不带缓冲的I/O;文件描述符  在linux系统中打开文件就会获得文件描述符,它

2015-09-03 22:19:39 2461

原创 [leetcode] 216 Combination Sum III

很基础的一道DFS,开始的时候觉得可能剪枝要处理的好一些,于是我的剪枝是:如果当前的值合适,那么剩下的和一定要大于剩下的个数*1&&小于剩下的个数*9,这虽然不是最优,但是处理起来比较简单,没想到样例只有18组,跑了0ms,数据太水了。class Solution { private: vector >ans; vector v; public: void dfs(i

2015-09-03 00:24:16 3104

原创 Linux下Makefile快速编写入门

(一)为什么要编写Makefile     我们自己平常在linux下编译源文件时,当然可以使用gcc -Wall -g main.c -o main这样的命令一个一个编译,但是一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,我们一个个编译是极其花费时间的,也是不可取的。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自

2015-09-02 18:31:30 5785

gdb多线程调试小文件

基于Linux64位的多线程小程序,答案就在某个线程的堆栈中,请使用gdb命令查看哈

2016-03-03

随机数生成器

随机数生成器,自定义范围,支持跳变,适用于各个活动的抽奖

2015-11-30

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

TA关注的人

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