tonglin0325的个人主页

Java排序算法——快速排序

输入是List

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
package com.interview.sort;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class QuickSort2 { //输入是List<Integer>

public static void main(String[] args) {
// TODO 自动生成的方法存根
List<Integer> list = new ArrayList<Integer>();
list.add(-1);
list.add(3);
list.add(-0);
list.add(-2);
list.add(-7);
list.add(-5);
QuickSort2 qs = new QuickSort2();
qs.quickSort(list);
Iterator<Integer> i = list.iterator();
while (i.hasNext()) {
int num = (Integer) i.next();
System.out.println(num);
}

}

public void quickSort(List<Integer> list) {
if (list.size() > 1) {
List<Integer> smaller = new ArrayList<Integer>();
List<Integer> same = new ArrayList<Integer>();
List<Integer> larger = new ArrayList<Integer>();
Integer mid = list.get(list.size() >> 1);
for (Integer i : list) {
if (i < mid) {
smaller.add(i);
} else if (i > mid) {
larger.add(i);
} else {
same.add(i);
}
}
quickSort(smaller);
quickSort(larger);
list.clear();
list.addAll(smaller);
list.addAll(same);
list.addAll(larger);
}
}

}

输入是Array

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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import java.util.Arrays;

class Arrays_Quick{
private int[] arrays;
private int curNum;

public Arrays_Quick(int max) { //建立一个max长度的空数组
super();
arrays = new int[max];
curNum = 0;
}

public void insert(int value){ //往空的数组里面增加元素
arrays[curNum] = value;
curNum++;
}

public void display(){ //显示数组
System.out.println(Arrays.toString(arrays));
}

public void QuickSort(){
int i=0;
int j=arrays.length-1;

recQuickSort(i, j);
}

public void recQuickSort(int i,int j){
// 结束条件
if(i == j )
return;

int key = arrays[i];
int stepi = i; // 记录开始位置
int stepj = j; // 记录结束位置

while(j > i){
// j <<-------------- 向前查找
if(arrays[j] >= key){
j--;
}else{
arrays[i] = arrays[j];
//i++ ------------>>向后查找
while(j > ++i){
if(arrays[i] > key){
arrays[j] = arrays[i];
break;
}
}
}
}

// 如果第一个取出的 key 是最小的数
if(stepi == i){
recQuickSort(++i, stepj);
return;
}

// 最后一个空位留给 key
arrays[i] = key;

// 递归
recQuickSort(stepi, i);
recQuickSort(j, stepj);
}
}

public class QuickSort {

public static void main(String[] args) {
// TODO 自动生成的方法存根
int maxSize = 5;
Arrays_Quick arrays_demo = new Arrays_Quick(maxSize);
arrays_demo.insert(4);
arrays_demo.insert(5);
arrays_demo.insert(3);
arrays_demo.insert(1);
arrays_demo.insert(2);
arrays_demo.display();
arrays_demo.QuickSort();
arrays_demo.display();
}

}

全文 >>

Java递归算法——二分查找

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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import java.lang.reflect.Array;
import java.nio.Buffer;
import java.util.Arrays;
import java.util.Random;

class Rec_Find{
private int[] temp;
private int searchKey;
//private int lowerBound = 0; //下界
//private int upperBound ; //上界
private int nElement;

public int[] getTemp() {
return temp;
}

public void setTemp(int[] temp) {
this.temp = temp;
}

public Rec_Find(int[] temp) {//构造函数
this.temp = temp;
//this.upperBound = temp.length-1;
}

public int find(int searchKey,int lowerBound,int upperBound){
int curNum;
this.searchKey = searchKey;
curNum = (lowerBound+upperBound)/2;
if(temp[curNum]==this.searchKey){
return curNum; //find
}
else if(lowerBound>upperBound){
return -1; //没有find
}
else{
if(temp[curNum]<this.searchKey){
return find(searchKey,curNum+1,upperBound);
}
else{
return find(searchKey,lowerBound,curNum-1);
}
}
}
}

class RandomArray{ //生成随机数组,有Num个

private int[] Arrays;

public int[] getArrays(int Num){
// int[] Arrays = new int[Num];
Arrays = new int[Num];
Random r = new Random();

for(int i=0;i<Num;i++){
Arrays[i] = r.nextInt(1000);
// System.out.print(Arrays[i]+"、");
}
return Arrays;
}
}

class OrderedArray{ //生成有序数组,从0开始到Num

public int[] getArrays(int Num){
int[] Arrays = new int[Num];

for(int i=0;i<Num;i++){
Arrays[i] = i;
// System.out.print(Arrays[i]+"、");
}
return Arrays;
}
}

public class RecFind {

public static void main(String[] args) {

// RandomArrays array_demo = new RandomArrays();
// BinarySearch_Find arrays = new BinarySearch_Find(array_demo.getArrays(100));

OrderedArray array_demo = new OrderedArray();
Rec_Find arrays = new Rec_Find(array_demo.getArrays(100));
System.out.println(Arrays.toString(arrays.getTemp()));
System.out.println(arrays.find(55,0,100));
}
}

全文 >>

Java递归算法——汉诺塔问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Tower_demo {

static int nDisks = 3;

public static void main(String[] args) {
doTower(nDisks, 'A', 'B', 'C');
}

public static void doTower(int topN,char from,char inter,char to){
if(topN == 1)
System.out.println("Disk 1 from "+from+" to "+to);
else{
doTower(topN-1, from, to, inter);
System.out.println("Disk "+topN+" from "+from+" to "+to);
doTower(topN-1, inter, from, to);
}
}

}

全文 >>

Java递归算法——阶乘

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
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Factorial_demo {

public static void main(String[] args) throws Exception{
// TODO 自动生成的方法存根
System.out.println("输入数字:");
int theNumber = getInt();
int theAnswer = factorial(theNumber);
System.out.println("阶乘:"+theAnswer);
}

public static int factorial(int n){ //递归
if(n == 1)
return 1;
else
return (n*factorial(n-1));
}

//输出方法
public static String getString() throws IOException{
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String s = br.readLine();
return s;
}

//输出方法
public static int getInt() throws IOException{
String s = getString();
return Integer.parseInt(s);
}
}

全文 >>

ubuntu下增加中文编码

1.查看系统的语言环境

在Ubuntu中,利用locale命令

运行locale指令得到当前系统编码设置的详细资料。

一、locale的五脏六腑

1、 语言符号及其分类(LC_CTYPE)
2、 数字(LC_NUMERIC)
3、 比较和排序习惯(LC_COLLATE)
4、 时间显示格式(LC_TIME)
5、 货币单位(LC_MONETARY)
6、 信息主要是提示信息,错误信息, 状态信息, 标题, 标签, 按钮和菜单等(LC_MESSAGES)
7、 姓名书写方式(LC_NAME)
8、 地址书写方式(LC_ADDRESS)
9、 电话号码书写方式(LC_TELEPHONE)
10、度量衡表达方式(LC_MEASUREMENT)
11、默认纸张尺寸大小(LC_PAPER)
12、对locale自身包含信息的概述(LC_IDENTIFICATION)。

二、理解locale的设置

设定locale就是设定12大类的locale分类属性,即 12个LC_*。除了这12个变量可以设定以外,为了简便起见,还有两个变量:LC_ALL和LANG。

它们之间有一个优先级的关系:LC_ALL > LC_* > LANG

可以这么说,LC_ALL是最上级设定或者强制设定,而LANG是默认设定值。

三 具体设定locale的方法(zh_CN.UTF-8、zh_CN.GBK)

freebsd的设置:

1.GDM登录改为终端登录后startx启动图形桌面

2.在~/.cshrc中增加如下语句,(根据自己使用的shell进行相应设置)

setenv LANG zh_CN.GBK
setenv LC_ALL zh_CN.GBK
setenv LC_CTYPE zh_CN.GBK

3.修改/etc/fstab的默认值:

linux 设置:

1.修改/etc/sysconfig/i18n文件,LANG=”zh_CN.UTF-8”或LANG=”zh_CN.GBK”

普通用户修改~/.profile


export LANG zh_CN.GBK

2.修改/etc/fstab的默认值

参考:http://blog.chinaunix.net/uid-94449-id-2002589.html

2.修改语言环境

方法1:

1
2
vim /etc/sysconfig/i18n

默认为:

1
2
3
LANG="en_US.UTF-8"
SYSFONT="latarcyrheb-sun16"

修改为:

1
2
3
4
LANG="zh_CN.GBK"
SUPPORTED="zh_CN.UTF-8:zh_CN:zh"
SYSFONT="latarcyrheb-sun16"

方法2:

1
2
3
4
5
vim /etc/profile

export LC_ALL="zh_CN.GBK"
export LANG="zh_CN.GBK"

Windows的默认编码为GBK,Linux的默认编码为UTF-8。在Windows下编辑的中文,在Linux下显示为乱码。

为了解决此问题,修改Linux的默认编码为GBK。方法如下:

ubuntu 16.04可以使用方法3:

Ubuntu默认的中文字符编码为zh_CN.UTF-8,这个可以在/etc/environment中看到:

1
2
3
4
5
6
sudo cat /etc/environment

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
LANG="zh_CN.UTF-8"
LANGUAGE="zh_CN:zh:en_US:en"

第二行即是默认的中文字符编码。注:可以通过这里修改默认的中文编码字符,比如修改为:zh_CN.GBK。

全文 >>

使用python操作Amazon S3

1.判断s3 object是否存在

1
2
3
4
5
6
7
8
9
10
11
import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket('my-bucket')
key = 'dootdoot.jpg'
objs = list(bucket.objects.filter(Prefix=key))
if any([w.key == path_s3 for w in objs]):
print("Exists!")
else:
print("Doesn't exist")

2.读取s3 object文件内容

1
2
3
4
5
6
import boto3

s3 = boto3.resource('s3')
object_content = s3.Object('my_bucket_name', object_dir)
file_content = object_content.get()['Body'].read().decode('utf-8')

3.列出s3 object目录

1
2
3
4
5
6
7
8
import boto3

s3 = boto3.resource('s3')
my_bucket = s3.Bucket('my_bucket_name')
dirs = sorted([_.key for _ in my_bucket.objects.filter(Prefix="aaa/bbb/ccc/")], reverse=True)
for dir in dirs:
print(dir)

4.查看emr集群信息,参考:https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/emr.html#EMR.Client.describe_cluster

1
2
3
4
5
6
import boto3

emr_client = boto3.client('emr',region_name='us-west-2')
response = emr_client.describe_cluster(ClusterId="j-xxxxxx")
print(response['Cluster']['MasterPublicDnsName'])

CDH5.16集成ldap

集成ldap之前请参考安装好openldap:Ubuntu16.04安装openldap和phpldapadmin

1.hadoop集成ldap

HDFS 的文件权限与 Linux/Unix 系统类似,也是采用UGO模型,分成用户、组和其他权限。其权限you两种实现方式:1.基于Linux/Unix系统的用户和用户组;2.基于使用LDAP协议的数据库

参考网易数帆的文章:HDFS权限管理实践

使用基于Linux/Unix系统的用户和用户组,即 hadoop.security.group.mapping 的值为 org.apache.hadoop.security.ShellBasedUnixGroupsMapping

使用基于使用LDAP协议的数据库,即 hadoop.security.group.mapping 的值为

全文 >>