表单的操作

序列化

    $.fn.serializeObject = function()
    {
        var o = {};
        var a = this.serializeArray();
        $.each(a, function() {
            if (o[this.name] !== undefined) {
                if (!o[this.name].push) {
                    o[this.name] = [o[this.name]];
                }
                o[this.name].push(this.value || '');
            } else {
                o[this.name] = this.value || '';
            }
        });
        return o;
    };

回填

$.fn.formFieldValues = function (data) {
        var els = this.find(':input').get();

        if (arguments.length === 0) {
            // return all data
            data = {};

            $.each(els, function () {
                if (this.name && !this.disabled && (this.checked
                        || /select|textarea/i.test(this.nodeName)
                        || /text|hidden|password/i.test(this.type))) {
                    if (data[this.name] == undefined) {
                        data[this.name] = [];
                    }
                    data[this.name].push($(this).val());
                }
            });
            return data;
        } else {
            $.each(els, function () {
                if (this.name && data[this.name]) {
                    var names = data[this.name];
                    var $this = $(this);
                    if (Object.prototype.toString.call(names) !== '[object Array]') {
                        names = [names]; //backwards compat to old version of this code
                    }
                    if (this.type == 'checkbox' || this.type == 'radio') {
                        var val = $this.val();
                        var found = false;
                        for (var i = 0; i < names.length; i++) {
                            if (names[i] == val) {
                                found = true;
                                break;
                            }
                        }
                        $this.attr("checked", found);
                    } else {
                        $this.val(names[0]);
                    }
                }
            });
            return this;
        }
    };

ThinkPHP框架开发的应用的标准执行流程

  1. 用户URL请求
  2. 调用应用入口文件(通常是网站的index.php)
  3. 载入框架入口文件(ThinkPHP.php)
  4. 记录初始运行时间和内存开销
  5. 系统常量判断及定义
  6. 载入框架引导类(ThinkThink)并执行Think::start方法进行应用初始化
  7. 设置错误处理机制和自动加载机制
  8. 调用ThinkStorage类进行存储初始化(由STORAGE_TYPE常量定义存储类型)
  9. 部署模式下如果存在应用编译缓存文件则直接加载(直接跳转到步骤22)
  10. 读取应用模式(由APP_MODE常量定义)的定义文件(以下以普通模式为例说明)
  11. 加载当前应用模式定义的核心文件(普通模式是 ThinkPHP/Mode/common.php)
  12. 加载惯例配置文件(普通模式是 ThinkPHP/Conf/convention.php)
  13. 加载应用配置文件(普通模式是 Application/Common/Conf/config.php)
  14. 加载系统别名定义
  15. 判断并读取应用别名定义文件(普通模式是 Application/Common/Conf/alias.php)
  16. 加载系统行为定义
  17. 判断并读取应用行为定义文件(普通模式是 Application/Common/Conf/tags.php)
  18. 加载框架底层语言包(普通模式是 ThinkPHP/Lang/zh-cn.php)
  19. 如果是部署模式则生成应用编译缓存文件
  20. 加载调试模式系统配置文件(ThinkPHP/Conf/debug.php)
  21. 判断并读取应用的调试配置文件(默认是 Application/Common/Conf/debug.php)
  22. 判断应用状态并读取状态配置文件(如果APP_STATUS常量定义不为空的话)
  23. 检测应用目录结构并自动生成(如果CHECK_APP_DIR配置开启并且RUNTIME_PATH目录不存在的情况下)
  24. 调用ThinkApp类的run方法启动应用
  25. 应用初始化(app_init)标签位侦听并执行绑定行为
  26. 判断并加载动态配置和函数文件
  27. 调用ThinkDispatcher::dispatch方法进行URL请求调度
  28. 自动识别兼容URL模式和命令行模式下面的$_SERVER[‘PATH_INFO’]参数
  29. 检测域名部署以及完成模块和控制器的绑定操作(APP_SUB_DOMAIN_DEPLOY参数开启)
  30. 分析URL地址中的PATH_INFO信息
  31. 获取请求的模块信息
  32. 检测模块是否存在和允许访问
  33. 判断并加载模块配置文件、别名定义、行为定义及函数文件
  34. 判断并加载模块的动态配置和函数文件
  35. 模块的URL模式判断
  36. 模块的路由检测(URL_ROUTER_ON开启)
  37. PATH_INFO处理(path_info)标签位侦听并执行绑定行为
  38. URL后缀检测(URL_DENY_SUFFIX以及URL_HTML_SUFFIX处理)
  39. 获取当前控制器和操作,以及URL其他参数
  40. URL请求调度完成(url_dispatch)标签位侦听并执行绑定行为
  41. 应用开始(app_begin)标签位侦听并执行绑定行为
  42. 调用SESSION_OPTIONS配置参数进行Session初始化(如果不是命令行模式)
  43. 根据请求执行控制器方法
  44. 如果控制器不存在则检测空控制器是否存在
  45. 控制器开始(action_begin)标签位侦听并执行绑定行为
  46. 默认调用系统的ReadHtmlCache行为读取静态缓存(HTML_CACHE_ON参数开启)
  47. 判断并调用控制器的_initialize初始化方法
  48. 判断操作方法是否存在,如果不存在则检测是否定义空操作方法
  49. 判断前置操作方法是否定义,有的话执行
  50. Action参数绑定检测,自动匹配操作方法的参数
  51. 如果有模版渲染(调用控制器display方法)
  52. 视图开始(view_begin)标签位侦听并执行绑定行为
  53. 调用ThinkView的fetch方法解析并获取模版内容
  54. 自动识别当前主题以及定位模版文件
  55. 视图解析(view_parse)标签位侦听并执行绑定行为
  56. 默认调用内置ParseTemplate行为解析模版(普通模式下面)
  57. 模版引擎解析模版内容后生成模版缓存
  58. 模版过滤替换(template_filter)标签位侦听并执行绑定行为
  59. 默认调用系统的ContentReplace行为进行模版替换
  60. 输出内容过滤(view_filter)标签位侦听并执行绑定行为
  61. 默认调用系统的WriteHtmlCache行为写入静态缓存(HTML_CACHE_ON参数开启)
  62. 调用ThinkView类的render方法输出渲染内容
  63. 视图结束(view_end)标签位侦听并执行绑定行为
  64. 判断后置操作方法是否定义,有的话执行
  65. 控制器结束(action_end)标签位侦听并执行绑定行为
  66. 应用结束(app_end)标签位侦听并执行绑定行为
  67. 执行系统的ShowPageTrace行为(SHOW_PAGE_TRACE参数开启并且不是AJAX请求)
  68. 日志信息存储写入

快速排序

public static void quickSort(int[] array, int start, int end) {
	if (start < end) {
		int middle = getMiddle(array, start, end);
		quickSort(array, 0, middle - 1);
		quickSort(array, middle + 1, end);
	}
}

private static int getMiddle(int[] array, int start, int end) {
	int baseVal = array[start];
	while (start < end) {
		while (start < end && array[end] >= baseVal) {
			end--;
		}
		array[start] = array[end];
		while (start < end && array[end] <= baseVal) {
			start++;
		}
		array[end] = array[start];
	}
	array[start] = baseVal;
	return start;
}

二分查找

递归方法:

public static int search(int[] array, int start, int end, int val) {
	int mid = (end + start) / 2;
	if (array[mid] == val) {
		return mid;
	}
	if (array[mid] > val) {
		end = mid - 1;
	}
	if (array[mid] < val) {
		start = mid + 1;
	}
	int r = search(array, start, end, val);
	if (r >= 0) {
		return r;
	}
	return -1;
}

非递归:

public static int search2(int[] array, int val) {
	int start = 0;
	int end = array.length - 1;
	while (end >= start) {
		int mid = (end + start) / 2;
		if (array[mid] == val) {
			return mid;
		}
		if (array[mid] > val) {
			end = mid - 1;
		}
		if (array[mid] < val) {
			start = mid + 1;
		}
	}
	return -1;
}

0/1背包算法

装货问题
隔壁老王开着顺丰的标配货车(限载5吨,含5吨,不考虑限高),想要一次性拿走尽可能重的货物,这些货有红木沙发,有钢材等等。

货物编号   货物重量(单位:kg)
1         509
2         838
3         924
4         650
5         604
6         793
7         564
8         651
9         697
10        649
11        747
12        787
13        701
14        605
15        644

背包算法递归定义最优解的方程式:
wechatimg49
大概解释一下:
i 代表第几个货物,j表示当前容量,w(i)表示第i个货物的重量,v(i)表示第i个货物的价值,m(i,j)表示第i个货物,容量为j的最优解
转态转移的时候有两种情况:
1.可以装下一个 j>= w(i),这种情况可以装入这个物品,比较装入后和没有装入的最优解,决定是否装入
2.不可以装下一个 0<=j<=w(i), 这种情况不能装入这个物品,最优解不变

代码实现:


public static int knapsack(int val[], int wt[], int W) {
	int N = wt.length;
	
        //构造一个二维数组
	int[][] V = new int[N + 1][W + 1];
        //初始化数组数据
	for (int col = 0; col <= W; col++) {
		V[0][col] = 0;
	}
         
	for (int row = 0; row <= N; row++) {
		V[row][0] = 0;
	}

	for (int item = 1; item <= N; item++) {
		for (int weight = 1; weight <= W; weight++) {
			if (wt[item - 1] <= weight) {
                //可以装入
				V[item][weight] = Math.max(val[item - 1] + V[item - 1][weight - wt[item - 1]], V[item - 1][weight]);
			} else {
                //不能装入
				V[item][weight] = V[item - 1][weight];
			}
		}

	}

	// 计算选择结果
	int j = W;
	int length = N;
	StringBuilder stringBuilder = new StringBuilder();
	for (int i = length; i > 0; --i) {
		//转态转移的时候记录
		if (V[i][j] > V[i - 1][j]) {
			stringBuilder.append(i).append("-");
			j = j - wt[i-1];
		}
	}
	String result = stringBuilder.toString();
	System.out.println("选择的序号 : " + result.substring(0, result.length()-1));
	
	//打印表
	for (int[] rows : V) {
	      for (int col : rows) {
		System.out.format("%5d", col);
	       }
	      System.out.println();
	}

	return V[N][W];
}

红包算法

JAVA

public class SplitRedPacket {

	public static void main(String[] args) {
		LeftMoneyPackage leftMoneyPackage = new LeftMoneyPackage();
		leftMoneyPackage.remainMoney = 10;
		leftMoneyPackage.remainSize = 8;
		int i = 1;
		while (leftMoneyPackage.remainSize > 0) {
			double money = getRandomMoney(leftMoneyPackage);
			System.out.println(i + " : " + money);
			i++;
		}
	}

	public static double getRandomMoney(LeftMoneyPackage _leftMoneyPackage) {
		// remainSize 剩余的红包数量
		// remainMoney 剩余的钱
		if (_leftMoneyPackage.remainSize == 1) {
			_leftMoneyPackage.remainSize--;
			return (double) Math.round(_leftMoneyPackage.remainMoney * 100) / 100;
		}
		Random r = new Random();
		double min = 0.01; //最小金额
		double max = _leftMoneyPackage.remainMoney / _leftMoneyPackage.remainSize * 2;
		double money = r.nextDouble() * max;
		money = money <= min ? min : money;
		money = Math.floor(money * 100) / 100;
		_leftMoneyPackage.remainSize--;
		_leftMoneyPackage.remainMoney -= money;
		return money;
	}

}

class LeftMoneyPackage {
	public int remainSize;
	public double remainMoney;

	public static class BuildLeftMoneyPackage {
		
	}

}

PHP

$total=10;//红包总额
$num=8;// 分成8个红包,支持8人随机领取
$min=0.01;//每个人最少能收到0.01元

for ($i=1;$i<$num;$i++)
{
    $safe_total=($total-($num-$i)*$min)/($num-$i);//随机安全上限
    $money=mt_rand($min*100,$safe_total*100)/100;
    $total=$total-$money;
    echo '第'.$i.'个红包:'.$money.' 元,余额:'.$total.' 元 
';
}
echo '第'.$num.'个红包:'.$total.' 元,余额:0 元';

8张图理解Java

一图胜千言,下面图解均来自Program Creek 网站的Java教程,目前它们拥有最多的票选。如果图解没有阐明问题,那么你可以借助它的标题来一窥究竟。

1、字符串不变性

2、equals()方法、hashCode()方法的区别

HashCode被设计用来提高性能。equals()方法与hashCode()方法的区别在于:

  1. 如果两个对象相等(equal),那么他们一定有相同的哈希值。
  2. 如果两个对象的哈希值相同,但他们未必相等(equal)。

3、Java异常类的层次结构

图中红色部分为受检查异常。它们必须被捕获,或者在函数中声明为抛出该异常。

4、集合类的层次结构

注意Collections和Collection的区别。(Collections包含有各种有关集合操作的静态多态方法)

5、Java同步

Java同步机制可通过类比建筑物来阐明。

6、别名

别名意味着有多个变量指向同一可被更新的内存块,这些别名分别是不同的对象类型。

7、堆和栈

图解表明了方法和对象在运行时内存中的位置。

8、Java虚拟机运行时数据区域

图解展示了整个虚拟机运行时数据区域的情况。

原文链接: programcreek 翻译: ImportNew.com era_misa
译文链接: http://www.importnew.com/11725.html
[ 转载请保留原文出处、译者和译文链接。]