[LeetCode C++实现]124. Binary Tree Maximum Path

二叉树的题目虽然标着hard类型,但解起来有点爽,这道题目琢磨透了觉得非常的棒,可以说这种类型题目是一种套路。可以结合文章段错误segment fault分析一起使用更佳。或许屏幕前的朋友会有疑问,这篇讲函数调用栈的文章和leetcode124有啥关系?其实树里面很多递归的逻辑就是函数调用,直到调用到终止条件,然后层层向上返回的过程。

题目:

Given a non-empty binary tree, find the maximum path sum.

For this problem, a path is defined as any sequence of nodes ......

一个volatile引发的血案

周六项目组加班赶进度发布版本,遇到一个奇怪的问题,根据代码分析必走的逻辑居然没有打印日志,简直有点怀疑人生了。恰好昨晚看APUE信号章节时有看到书中明确说明,如果不加volatile,就会导致开启编译优化时去除循环语句的问题。

最终根据提交记录发现有人将整个项目的编译选项由原来的O1修改为了O3,优化理由是:提高程序的执行速度。当然是用优化选项O3能够提高程序的执行速度,代码如果写的有问题,会导致意想不到的问题。有意思的是我追查了下代码改动记录,15年的时候就有人尝试将O1修改为O3,过了几天又改动回来,估计是搞不定各种奇奇怪怪的问题。

改编自APUE示例代码:

#include &......

setjmp与longjmp

最近换了一种方式看APUE,直接看source code,如果这个程序看完没有疑问,并且执行结果与预想中的一样就跳过,看到第10章信号的时候源码中居然有setjmp和longjmp,之前的理解是这两个函数不就是加强版的goto吗?前几天写了篇文章段错误segment fault分析,函数调用会涉及到函数信息入栈出栈,所以这看似简单的两个函数,程序执行背后有着复杂的函数栈切换过程。

apue信号章节中引入setjmp和longjmp函数是为了解决例子sleep1.c中存在的第三个问题。

#include <signal.h>

#include <unistd......

段错误segment fault分析

最近工作中改了不少core,对segment fault有了一些肤浅的认识,本篇文章会试图总结常见的原因,使用非常浅显的汇编知识加以印证,有多浅显呢? 今天早上刚刚学完这篇文章汇编语言入门教程。文章标题虽然从分析segment fault写起,但仍然会延续想到哪写到哪的风格,如果对文章有任何疑问,欢迎留言讨论。

段错误产生的种类

总结几种原因,这里划分可能不科学,这里的划分可能有重叠,比如1 2是8栈溢出的一种形式。

1.数组(vector)越界

2.使用strcpy strcat 等不安全的字符串操作函数

3.多线程访问全局变量未加锁

4.多线程使用线程不安全函数

5.信号处......

日常开发笔记总结(六)

信号安全函数

进程捕获到信号并对其进行处理时,进程正在执行的正常指令序列就被信号处理程序临时中断,它首先执行该信号处理程序中的指令。如果从信号处理程序中返回,则继续执行在捕获到信号时进程正在执行的正常的指令序列。有如下三类函数不能在信号处理程序中调用(非信号安全函数)

a)已知它们使用静态数据结构(如getpwnam函数)

b)它们调用malloc或free函数

c)标准I/O函数,标准I/O库的很多实现都以不可重入的方式使用全局数据结构。这里需要特别说明一点,书上或网上一些例子,信号处理函数中调用了printf,这里仅仅为了直观说明程序的运行,printf不能在信号处理函数中调用。

......

EINTR信号介绍

code review的时候看新来的同事重复造了个轮子,使用open read write函数实现了与windows平台对应的函数CopyFile。不过他造的轮子有缺陷,没有处理信号EINTR。这篇文章通过EINTR为引子,来总结linux下与之相关的知识点,本篇文章将继续秉承想到哪写到哪的原则,由于平时大都写一些固定套路代码,如果在本文中有任何错误,欢迎指出。

从信号说起这篇文章中重点介绍了进程状态T(停止 traced or stoped),本篇开头先讲下进程状态D。

进程状态D

man ps手册中关于进程状态的描述:

PROCESS STATE CODES

Here are......

[LeetCode C++实现]78.Subsets

加班回来同事微信发来一道题目说这是整个leetcode中最棒的一道题目获益良多,本着我坚决不信的态度,尝试了两种平平无奇的解法后正打算开喷,在讨论区看到一种位运算的方法,好吧,我承认这是最棒的一道题。

Given a set of distinct integers, nums, return all possible subsets (the power set).

Note: The solution set must not contain duplicate subsets.

Example:

Input: nums = [1,2,3]

Output:

[

[3],

[1],

[......

[LeetCode C++实现]347. Top K Frequent Elements

Given a non-empty array of integers, return the k most frequent elements.

Example 1:

Input: nums = [1,1,1,2,2,3], k = 2

Output:

Example 2:

Input: nums = [1], k = 1

Output:

Note:

You may assume k is always valid, 1 ≤ k ≤ number of unique elements.

Your algorithm's time complexity......

[LeetCode C++实现]22.Generate Parentheses

Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.

For example, given n = 3, a solution set is:

[

"((()))",

"(()())",

"(())()",

"()(())",

"()()()"

]

首先这种类型的题目一眼看上去肯定是可以用递归的形式,递归的写法往往是一看就懂,......

从linux信号说起

以前的笔记里写过linux信号相关的使用,当时是读apue TLPI等书籍时记录的关于信号的一些编程知识。最近又改了一些shell脚本的bug,本篇笔记权当个人总结,主要从修改过的典型bug串起各知识点,文章延续之前想到哪写到哪的风格,如果内容有误,欢迎留言指出,不胜感激。

进程状态

D 不可中断 uninterruptible sleep (usually IO)

R 运行 runnable (on run queue)

S 中断 sleeping

T(t) 停止 traced or stopped

Z 僵死 a defunct ("zombie") process

重点......