为什么C语言不会过时?

这是C语言系列博客的第3篇,如果对前2篇感兴趣,可以点击下面的链接:什么教材适合零基础的C语言学习者?为什么C语言很难评价任何一门编程语言,都是招人骂的。 永远是这样。就像是春寒料峭的季节, 街上穿棉袄和穿单衣的擦肩而过,双方一定是同时在心里出现了两个字:“傻逼!”这个在心理学上有个专业的名字:叫做“二逼”现象那我为啥还要做这个挨骂的事呢?作为《C语言点滴》《drop of knowledge of C++》书籍的作者,《C语言新思维,第二版》的译者。我觉得我有责任系统的介绍一下这本语言,他的特点,还有他的未来。这个问题对很多刚刚踏入程序猿这个行业的新手至关重要。因为他们有深深的担忧,万一C语言就像Fortran,perl语言那样过时了怎么办?为什么C语言不会过时?先上一个表,这个就是著名的TIOBE语言排行榜。目前它是一个最权威的一个语言流行度的排行榜,从这个排行榜上看,你会得到一个... Read More

小旭讲解 LeetCode 399. Evaluate Division 并查集

原题英文 —— Evaluate DivisioEquations are given in the formatA / B = k, whereAandBare variables represented as strings, andkis a real number (floating point number). Given some queries, return the answers. If the answer does not exist, return-1.0.Example:Givena / b = 2.0, b / c = 3.0.queries are:a / c = ?, b / a = ?, a / e = ?, a / a = ?, x / x = ? .return[6.0, 0.5, -1.0, 1.0, -1.0 ].The input is:vec... Read More

[LeetCode]743. Network Delay Time

原题There are N network nodes, labelled 1 to N.Given times, a list of travel times as directed edges times[i] = (u, v, w), where u is the source node, v is the target node, and w is the time it takes for a signal to travel from source to target.Now, we send a signal from a certain node K. How long will it take for all nodes to receive the signal? If it is impossible, return -1.NoteN will be in the ... Read More

[LeetCode]893. Groups of Special-Equivalent Strings

原题You are given an array A of strings.Two strings S and T are special-equivalent if after any number of moves, S == T.A move consists of choosing two indices i and j with i % 2 == j % 2, and swapping S[i] with S[j].Now, a group of special-equivalent strings from A is a non-empty subset S of A such that any string not in S is not special-equivalent with any string in S.Return the number of groups o... Read More

[LeetCode]Valid Palindrome II

原题Given a non-empty string s, you may delete at most one character. Judge whether you can make it a palindrome.Example 1Input: "aba"Output: TruExample 2Input: "abca"Output: TruExplanation: You could delete the character 'c'.NoteThe string will only contain lowercase characters a-z. The maximum length of the string is 50000.思路水题。判断是否是回文字符串最简单的方式就是从左右两端逐步向中心逼近(双指针),如下代码[code lang="cpp"for (in... Read More

[LeetCode]Remove Nth Node From End of List

原题Given a linked list, remove the n-th node from the end of list and return its head.ExampleGiven linked list: 1->2->3->4->5, and n = 2.After removing the second node from the end, the linked list becomes 1->2->3->5.NoteGiven n will always be valid.Follow upCould you do this in one pass思路首先,明确题意。题目给出了一个只有后继(successor),没有前驱(predecessor)的一个单向链表。要求删除倒数第n个节点。那么,思路自然会想到的就是在一次遍历就搞定题目要求。所以,我们自然要在遍历的过程中保存一... Read More

[LeetCode]4Sum

原题Given an array nums of n integers and an integer target, are there elements a, b, c, and d in nums such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.NoteThe solution set must not contain duplicate quadruplets.ExampleGiven array nums = [1, 0, -1, 0, -2, 2], and target = 0.A solution set is[-1, 0, 0, 1][-2, -1, 1, 2][-2, 0, 0, 2题解本题的... Read More

[LeetCode]3Sum Closest

原题Given an array nums of n integers and an integer target, find three integers in nums such that the sum is closest to target. Return the sum of the three integers. You may assume that each input would have exactly one solution.ExampleGiven array nums = [-1, 2, 1, -4], and target = 1.The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).思路本题目的解题思路和3Sum很像,区别在于3Sum求解的是三个数字和为target(即为0),然而3Su... Read More

[LeetCode]3Sum

原题Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.Note: The solution set must not contain duplicate triplets.For example, given array S = [-1, 0, 1, 2, -1, -4]A solution set is[-1, 0, 1][-1, -1, 2题解暴力解法因为需要计算三个数字的总和,所以需要进行3层的遍历,故时间复杂度需要O(n^3),看来不可取,果断放弃。毕竟是medium难度的题,不至于这么个解法。two-pointes solutio... Read More

[LeetCode]Two Sum

原题Given an array of integers, return indices of the two numbers such that they add up to a specific target.You may assume that each input would have exactly one solution, and you may not use the same element twice.ExampleGiven nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1].题解暴力解法暴力解法使用两层for循环,遍历每一种存在的情况。[code lang="cpp"class Solution publicvector<int... Read More

[LeetCode]Palinkdrom Number

ProbleDetermine whether an integer is a palindrome. Do this without extra space.Some hints[code lang="shell" collapse="true"Could negative integers be palindromes? (ie, -1If you are thinking of converting the integer to string, note the restriction of using extra space.You could also try reversing an integer. However, if you have solved the problem "Reverse Integer", you know that th... Read More

[LeetCode]Roman to Integer

ProbleGiven a roman numeral, convert it to an integer.Input is guaranteed to be within the range from 1 to 3999.IdeaFinding the Law of Changing Roman Numbers into Arabic Numbers。Solutio[code lang="cpp"class Solution publicint romanToInt(string s) int l = s.length(), a = 0;for (int i = 0; i < l; ++iif (i < l - 1 && char2int(s[i]) < char2int(s[i + 1])) a -= char2int(s[i]);} else a += char2int(s[i]);... Read More

跟我一起写Makefile

概述什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的集成开发环境(integrated development environment, IDE)都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计其数,并且按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为ma... Read More

2018LeeCode算法题解一之Valid Palindrome

原题Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.For example"A man, a plan, a canal: Panama" is a palindrome."race a car" is not a palindrome.NoteHave you consider that the string might be empty? This is a good question to ask during an interview.For the purpose of this problem, we define empty string as valid palindrome.原题链接:https://... Read More

[维护中]基于文本图形(ncurses)的文本搜索工具 ncgrep

源码下载http://github.com/ncgrep/ncgre背景作为一个VIM党,日常工作开发中,会经常利用grep进行关键词搜索,以快速定位到文件。如图但是,这一过程会有两个效率问题展示的结果无法进行直接交互,需要手动粘贴文件路径在打开展示的结果没有进行分组,直接将结果罗列出来可想而知,当搜索的内容结果集比较大时,可谓痛苦。那可以用Vim中的Ag插件进行搜索啊?是的,但他只解决了交互的问题。仍然没有解决结果集分组分类的痛点。思路在使用Eclipse等IDE进行文本全局搜索时,在加载效果(懒加载)可视化方面有很大优势。那么,期望基于linux系统,提供一个类似的搜索工具。优点(功能)如下结果集可以直接交互结果集可以进行分组展示结果集通过“懒加载”方式装载基于文本图形界面的类库是什么呢?网上大致了解了下VIM、htop类似的软件,其都是基于一个叫ncurses的类库实现的。项目... Read More

使用Cgo的一点总结

今天想给一个C库写一个Golang binding,就查了一下cgo的使用,也遇到了一些坑。cgo的基本使用想在Go代码中使用C语言必须在代码开头注释中写,然后再紧接着的下一行写import "C",这样就算是导入完成了。这个”C”不是一个真正的包,而是一个类似于命名空间的东西,所有能调用的C的变量、函数都包含在里面。举个最简单的例子package mai// #include <stdi// #include <stdli/void print(char *str) printf("%s\n", str);*import "C"import "unsafe"func main() s := "hello"cs := C.CString(sdefer C.free(unsafe.Pointer(cs)C.print(cs这个例子展示了cgo的基本使用方法。... Read More

关于int的取值范围(有种背下来)

unsigned int 0~429496729int -2147483648~214748364unsigned long 0~429496729long -2147483648~214748364long long的最大值:922337203685477580long long的最小值:-922337203685477580unsigned long long的最大值:184467440737095516__int64的最大值:922337203685477580__int64的最小值:-922337203685477580unsigned __int64的最大值:1844674407370955161原文链接:http://blog.csdn.net/niuox/article/details/823194 Read More

最长不重复子字符串问题(动态规划)

问题Given a string, find the length of the longest substring without repeating characters.ExamplesGiven "abcabcbb", the answer is "abc", which the length is 3.Given "bbbbb", the answer is "b", with the length of 1.Given "pwwkew", the answer is "wke", with the length of 3. Note that the answer must be a substring, "pwke" is a subsequenceand not a substring.分析首先,这种题肯定不能暴力来解决,否则肯定会超时。所以,考虑用一个哈希表(Map&l... Read More

【PHP扩展开发】深入理解PHP7之ZVAL

PHP7已经发布, 如承诺, 我也要开始这个系列的文章的编写, 今天我想先和大家聊聊zval的变化. 在讲zval变化的之前我们先来看看zval在PHP5下面是什么样子版权申明本文是原创作品,包括文字、资料、图片、网页格式,转载时请标注作者与来源。非经允许,不得用于赢利目的。PHPzval回顾在PHP5的时候, zval的定义如下struct _zval_struct union long lval;double dval;struct char *val;int len;} str;HashTable *ht;zend_object_value obj;zend_ast *ast;} value;zend_uint refcount__gc;zend_uchar type;zend_uchar is_ref__gc;};对PHP5内核有了解的同学应该对这个结构比较熟悉, 因为... Read More

PHP Internals Book 中文版 – Zvals – 基础结构

基础结构一个zval(“Zend value”的缩写)代表一个任意类型的PHP变量。所以,它很可能是PHP中最重要的数据结构,同时你将会频繁地使用它。本章节讲述zvals的基础概念及其使用方法。类型和值每一个zval都会存储某个值和其对应的类型。这点非常重要,因为PHP是一门动态类型语言,所以变量的类型只有当运行时才会确定,并不是在编译时就能够确定。此外,zval的类型在其生命周期是可以改变的,所以如果这个zval在最初存储了一个整形,那么在之后的某个时间点他也可能会存储了一个字符串。 类型是存储在一个整形的标签中(一个 unsigned char 类型的变量)。它有8中类型的值,分别对应着PHP中的8中变量类型。这些值可以用诸如IS_TYPE形式的常量来使用。比如:IS_NULL对应null类型,IS_STRING对应字符串类型。真实的值是存储在一个联合体中,如下所示typedef union _zvalue_value ... Read More

PHP Internals Book 中文版 – Zvals

Zval本章节的主题为用来表达PHP变量的zval数据结构。我们将会围绕zvals的概念和如何在扩展开发中使用两方面来进行阐述。目录基础结构类型和值访问宏赋值内存管理值语义和引用语义引用计数和写时复制分配并初始化zval管理引用计数和zval销毁复制zval分离zval类型转换和操作符基础操作符比较类型转换 Read More

PHP Internals Book 中文版

你看到的是PHP内核中文版,翻译自PHP Internals Book。为什么要翻译对技术的饥渴对英语的热爱方便汉语作为母语的人学习交流官方网站PHP Internals BooGithub(更新最快https://github.com/GenialX/php-internals-book-in-chines关于作者Genial内容目录IntroductioUsing the PHP build systeBuilding PHBuilding PHP extensionCreating PHP extensionZvalBasic structurMemory managemenCasts and operationImplementing functionHashtableBasic structurHashtable APSymtable and array AP... Read More

c语言stack(栈)和heap(堆)的使用详解

一、预备知识—程序的内存分配一个由C/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。3、全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。4、文字常量区—常量字符串就是放在这里的。程序结束后由系统释放。5、程序代码区—存放函数体的二进制代码。二、例子程序代码如下[code lang="cpp"//main.cpint a=0;  //全局初始化区char *p1;  //全局未初始化区main(intb;栈... Read More

深度优先搜索之栈解迷宫(C++)

在之前的一篇关于搜索的文章中《广度优先搜索算法队解迷宫问题》有提到深度优先搜索(dfs)算法,其中有一种就是本篇文章提到的实现方法:利用栈解迷宫;《广度优先搜索算法队解迷宫问题》中利用栈解迷宫有一个bug,比如:在x点出发,向右走直到尽头回到x点,此时在向其他方向(比如上),那么不能再走曾经向右走过的路(坐标)。这次,我们增加一个direct_mark数组,来标记在每一个坐标上曾经走过的方向。程序范例[code lang="cpp"/** 栈解迷宫 - 深度优先搜索.* @authur genialx <admin@ihuxu.com>*#include <iostr#include <st#define LEFT #define RIGHT #define UP #define DOWN using namespace std;struct Path int x;... Read More

分治法解矩阵乘积

题目假设有A,B两个矩阵,且其均为n*n维矩阵,n为2的幂(n>=2)。求A与B的乘积。分治法解矩阵乘积通过上图我们可以看到书中的利用分治法解决的伪代码。解决思路一暴力解法时间复杂度O(n^3程序范例void solve_matrix_multiply_n3(int a[][MATRIX_LENGTH], int b[][MATRIX_LENGTH], int c[][MATRIX_LENGTH]for (int i = 0; i < MATRIX_LENGTH; i++) for (int j = 0; j < MATRIX_LENGTH; j++) for (int k = 0; k < MATRIX_LENGTH; k++) c[i][j] += a[i][k] * b[j][k];解决思路二利用分治法解决矩阵乘积程序范例void solve_matrix_mul... Read More

LeetCode OJ Algorithm – reverse linked list ii (medium)

原题Reverse a linked list from position m to n. Do it in-place and in one-pass.For exampleGiven 1->2->3->4->5->NULL, m = 2 and n = 4return 1->4->3-&gNoteGiven m, n satisfy the following condition1 ≤ m ≤ n ≤ length of list.地址https://leetcode.com/problems/reverse-linked-list-ii程序范例[code lang="cpp"/** Definition for singly-linked list.* struct ListNode * int val;* ListNode *next;* ... Read More

写C++就像是抱着一捆指针在浩瀚的内存中裸奔

Ja娃们,好久不见,最近和两位Java大牛喝了牛肉汤后,惊奇发现,他们都提及到了一个很有意思的话题:Java的开发效率比C++要高!小编的常识认为,C++的运行效率高,Java的开发效率高,但究竟是为什么,我觉得有必要弄个明白,我请教了几位大牛,他们这样说A大哥说了C++是面向内存编程,Java则是面向数据结构编程。C++里,内存是裸露的,可以拿到地址,随意徜徉,增了删了,没人拦你,等到跑的时候崩给你看。然而Java里,能操作的都是设计好的数据结构,array有长度,String不可变,每一个都是安全的,在内存和程序员之间,隔着JVM,像是包住了边边角角的房间,随便小孩折腾,不会受伤。Java程序员是孩子,嚷嚷要这个那个,玩完了就丢,JVM是家长,买买买,还要负责收拾。有的孩子熊点,屋子很乱,收拾起来费劲,但房子还在。C++程序员是神,操纵着江河湖海,日月星辰,但能力越大,责任越大,万... Read More