算法输入:$n$个元素的数组$A[1…n]$和正整数$k$,$1<=k<=n$。

算法输出:$A$中的第$k$小元素。

算法思想:现将数据按照每组5个大小分组,然后求出每一组的均值组成一个新的数组,求出新的数组mid_mid,根据mid_mid的值将数据分成3个大小的数组,将新分成的数组的大小和k比较,然后可以排除掉一部分数据,当这部分的数据比44小的时候,直接排序输出,否则的话继续运行上述步骤!

语法事项:

  • 对于静态变量,下次递归调用的时候值会不变,不会重新重新赋值初始化
  • 声明数组大小的时候,对于变量都不能直接A[n],即使这个值是从键盘中读出的,或者经过运算出来的。只能宏定义n的值。

  • 声明数组大小的时候,可以动态分配大小。

  • 可以A[] = { 数字},不必指明大小。

  • C语言中求不小于q/2的最小数可以用mid[(q+1)/2]

  • C语言中求不大于q/2的最大数可以用mid[q/2]

  • C语言中动态分配的数组指针要释放,当要递归调用的函数中包含数组指针的时候注意写法。

阅读全文 »

算法输入:正整数n

算法输出:数1到n的所有可能全排列

算法思想:假定可以产生n-1个数的所有排列,那么可以用扩展的方法生成1到n的排列。方法如下:生成2到n的排列,并且每个排列前面加上数1,接下来生成数1,3, 4,…,n的所有排列。并且在每个排列的前面加上数2。重复这个过程知道最后生成1,2,…,n-1的所有排列,并在每个排列的前面加上数n。

注意事项:函数调用的写法。对于交换的算法,必须要传入你要交换的地址,否则的话,如果采用下面的写法,只是调换了子程序的,主函数的两个元素的顺序没有变:

1
2
3
4
5
6
void swap(int dataone, int datatwo)
{
int tmp = dataone;
dataone = datatwo;
datatwo = tmp;
}
阅读全文 »

问题描述

A[1…n] 是一个整数序列,A中的整数a如果在A中的出现的次数大于N/2,那么a成为多数元素。例如,在序列 1,3,2,3,3,4,3 中,3是多数元素,因为 7 个元素中它出现 4 次。现在我们就要讨论如何利用计算机来找出一个序列中的多数元素,当然这个多数元素要么不存在,要么就只有一个。

算法描述

观察结论:在原序列中去除两个不同的元素后,那么在原序列中的多数元素在新的序列中还是多数元素。

算法输入:n个元素的数组A[1…n]

阅读全文 »

算法输入:基数排序,输入一张有n个数的表L={a1,a2,…,an}和k位数字

算法输出:按非降排列的L

算法思想:可以用数学归纳法证明,假定这些书的低k-1位数已经排好序,那么对第k位数完成排序之后,就可以完成所有的排序。

算法过程:首先根据最低位=1,把数分到表L1中;最低位=0的数,分到L0中;依次进行,直到这n个数字的最低位分配完毕。然后将这些表用顺序连接起来。进行次低位的排序,直到排序完成。

算法代码:

阅读全文 »

基础知识(其中部分是笔者推理猜测内容,如果存在错误,请告知,万分感激):
Ask:ISO是什么文件方式?
Answer:光盘镜像文件格式。大家还记得小的时候的光盘吧,另外大家是不是也曾经看过书上的装系统教程,书上通常都说第一个步骤是插入光盘。那么随着时代的发展,好多电脑都没有了光驱,我们就把光盘的东西以ISO文件的方式存放到电脑上,可以直接打开或者烧录到U盘中启动系统。

Ask:什么是可启动U盘?
Answer:我们把系统刻录到U盘等介质中,能从U盘启动操作系统。这样的U盘就叫可启动U盘。

Ask:什么是Windows PE:
Answer:即Windows预安装环境,可以理解为这个是Windows的最小系统,当你从U盘启动Windows PE的时候,因为硬盘不在这个系统之内,所以这个时候你拥有操作整个磁盘的最高权限,可以进行分区(正常情况下,不进去PE是不能操作C盘的),安装系统等操作。

Ask:写入ISO到U盘与直接复制ISO中的文件到U盘的区别:
Answer:猜测是因为写入到U盘的时候,会把需要引导linux的文件写入到第一个扇区。但是直接复制到U盘的时候,可能复制到第一个扇区文件不是引导文件,那么就无法引导系统安装。当然,这只是我的个人猜测。另外,对于UEFI启动方式,直接复制到U盘不刻录光盘是可以的,因为UEFI启动方式会自动寻找硬盘中FAT32分区的EFI文件夹下的.efi文件。

Ask:选择是32位操作系统还是64位的操作系统:
Answer:多少位即CPU一次可处理的数据量。现在大多数电脑都是64位的操作系统,所以大家都直接装64位的系统,但是如果你发现你的运行内存小于3G的时候就要检查自己的CPU是不是32位的了。提示:只有64位的系统、64位的CPU、64位的软件才能发挥64位的性能。

阅读全文 »

使用remastersys打包

注意事项:

  • 支持uefi模式下启动,也可以legacy模式
  • 需要修复引导(理论上应该不用才对).
  • 可以还原到扩展分区,不一定为主分区
  • 虽然原装系统有/和/home两个分区,打包以后再安装可以只有/分区,也可以有/和/home分区
  • 综上所述,这个iso只是有个人资料的ubuntu安装包,没有特殊的要求和限制
  • 为了保证安装成功最好分配交互空间

打包方法

安装remastersys,直接复制remastersys-2-0-12-en.deb到Ubuntu,双击打开,下载remastersys。

阅读全文 »

使用方法:

  • 运行环境为python2,使用之前需要所依赖的库:

微信机器人

1
2
3
4
pip install requests
pip install pyqrcode
pip install pypng
pip install Pillow

QQ机器人:

阅读全文 »

Server:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import socket
import sys
from thread import *

HOST = '' # Symbolic name meaning all available interfaces
PORT = 5555 # Arbitrary non-privileged port
lock = 0
client = 0
data = None
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print 'Socket created'
#Bind socket to local host and port
try:
s.bind((HOST, PORT))
except socket.error , msg:
print 'Bind failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1]
sys.exit()

print 'Socket bind complete'

#Start listening on socket
s.listen(10)
print 'Socket now listening'

#Function for handling connections. This will be used to create threads
def clientthread(conn, client):
global data, lock
#Sending message to connected client
# conn.send('Welcome to the server. Type something and hit enter\n') #send only takes string

#infinite loop so that function do not terminate and thread do not end.
while True:

#Receiving from client
if client % 2 == 0:
data = conn.recv(1024)
reply = 'OK...' + data
lock = 1
if not data:
break

conn.sendall(reply)
else:
if lock == 1:
conn.sendall(data)
lock = 0


#came out of loop
conn.close()

#now keep talking with the client
while 1:

#wait to accept a connection - blocking call
conn, addr = s.accept()
print 'Connected with ' + addr[0] + ':' + str(addr[1])

#start new thread takes 1st argument as a function name to be run, second is the tuple of arguments to the function.
start_new_thread(clientthread ,(conn,client,))
client += 1

s.close()

要点:开启多线程的时候多个线程用的代码段是相同的。要想不相同的可以加上lock、client标志进行判断!

Client one:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# -*- coding: utf-8 -*-
import socket

HOST='127.0.0.1'
PORT=5555

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #定义socket类型,网络通信,TCP
s.connect((HOST,PORT)) #要连接的IP与端口
while 1:
cmd=raw_input("Please input cmd:") #与人交互,输入命令
s.sendall(cmd) #把命令发送给对端
data=s.recv(1024) #把接收的数据定义为变量
print(data) #输出变量
s.close() #关闭连接
阅读全文 »

datetime是Python处理日期和时间的标准库。

获取当前日期和时间

我们先看如何获取当前日期和时间:

1
2
3
4
5
6
>>> from datetime import datetime
>>> now = datetime.now() # 获取当前datetime
>>> print(now)
2015-05-18 16:28:07.198690
>>> print(type(now))
<class 'datetime.datetime'>

注意到datetime是模块,datetime模块还包含一个datetime类,通过from datetime import datetime导入的才是datetime这个类。

阅读全文 »

背景

系统管理员经常需要SSH 或者telent 远程登录到Linux 服务器,经常运行一些需要很长时间才能完成的任务,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为它们执行的时间太长了。必须等待它们执行完毕,在此期间不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。

简介

GNU Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。

GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。

阅读全文 »