有序数组,求满足数字之和的两个数

原题是编程之美上的,数组无序。书上面的最优解法是先排序。。。所以有了这道题。

前提是有序,所以可以用O(n)解决。

即begin和end两个下标,往中间凑。如果sum满足输出。

如果大于目标,end--;

如果小于目标,begin++;
void sum_print(int* arr, int n, int sum)
{
int i, j;
for(i=0,j=n-1;i<j && i>=0 && j<n; )[......]

继续阅读

求单向链表倒数第 k 个结点

题目:输入一个单向链表,输出该链表中倒数第 k 个结点。

传统做法是获取到链表的长度n,然后走n-k布,此方法弱爆了……

做法:

1、指定一个新的指针,走k步。如果k布之内就到了NULL,显然无倒数第k这说法,返回错误即可。

2、新指针到位后,和root一起next,知道新指针到了NULL。此时输出root指针当前的data即可。
int ll_last_k(struct Node* root, int k)
{
// Make two ptr diff k di[......]

继续阅读

数据结构重读 - 树的计数问题

树的计数问题:具有n个结点的不同形态的树共有多少棵。即具有n个结点、互不相似的二叉树的数目bn。

二叉树的相似:两棵都为空树或者两棵都不是空树,而且它们的左右子树分别相似。

二叉树的等价:两者不仅相似,而且对应结点上的元素均相同。

二叉树在bn较小的时候形态和计数如下:

经过书上复杂的推导,含有n个结点的互不相似的二叉树个数为:

如果推广一下,不是二叉树而是树,则:

具有n个结点的互不相似的树的个数为tn = bn-1

即:

[......]

继续阅读

Python中操控ssh和sftp

在Python(其实任何语言都是)中操控ssh执行远程命令是一个很麻烦的事情……

首先要突破ssh密码的非交互模式,我之前一直用sshpass拼接各种复杂的字符串。

然后是之后的执行命令只能执行一行,或者是很长的字符串,拼接起来很麻烦。

Python中有一个很活跃的包ssh,它fork自大名鼎鼎的Paramiko,后者是经典的ssh模块,不过作者不再维护了。

1、安装
wget http://pypi.python.org/packages/source/s/ssh/s[......]

继续阅读

cut命令截取任意字节

我们知道Linux的shell命令中,head能读取头几行,tail读取末尾几行。

如果我们有一个文件只有一行,但是这行很长。我们又想读取头几个字节,怎么办呢?

用cut -b:
#头三个字节
echo "abcdefg" | cut -b 1-3
abc

#第3个字节
echo "abcdefg" | cut -b 3
c
2013.09.05更新:

如果我们想从尾部开始截取,怎么办?

使用rev,反向命令。例如[......]

继续阅读