日期:2014-05-16 浏览次数:20448 次
	function isLongerThan(str, limit){
		var length = str.length,
		    asciiCount;
		if(length > limit) return true;
		// 计算字符串中ASCii码的个数
		asciiCount = (str.match(/[\u0001-\u007f]+/g) || []).join("").length;
		length = (length - asciiCount) * 2 + asciiCount;
		return length > limit ? true : false;
	}
	isLongerThan("1234567890", 10);
	isLongerThan("12345678901", 10);
	isLongerThan("123456789测", 10);
	isLongerThan("12345678测", 10);
(function() {	
	this.numOfArranges = function (n){
		var numOfBlocks = parseInt(n/3), // 计算n个位置可以放置3×3盒子的个数
		    count = 1,
		    i;
		for(i=1;i<=numOfBlocks;i++){
			count += countOf(n, i);  // 依次将1到numOfBlocks个盒子放置在长度为n的标尺上,看有多少种
		}
		
		return count;
	}
	// 一定长度的标尺上放置特定个数的3×3盒子,有多少种组合
	// length:标尺的长度,numOfBlocks:盒子的个数
	function countOf(length, numOfBlocks){
		var left = length - numOfBlocks * 3;
		if(numOfBlocks == 1) {
			return (left >=0) ? (left + 1) : 0; // 只有一个盒子时,可放置位置的个数可直接得到。
		}
		else if(numOfBlocks > 1){ // 有多于一个盒子时,先放置一个在某位置,看剩余的位置和盒子有多少种组合
			var count = 0;
			for(var i=0;i<=left;i++){
				count += countOf(length-3-i, numOfBlocks-1);
			}
			return count;
		}
	}
})();
(function() {
	// 使用cache优化,去除重复计算
	this.numOfArranges_cache = function (n){
		var numOfBlocks = parseInt(n/3), // 计算n个位置可以放置3×3盒子的个数
		    count = 1,
		    i;
		for(i=1;i<=numOfBlocks;i++){
			count += countOf(n, i);  // 依次将1到numOfBlocks个盒子放置在长度为n的标尺上,看有多少种
		}
		
		return count;
	}
	// 一定长度的标尺上放置特定个数的3×3盒子,有多少种组合
	// length:标尺的长度,numOfBlocks:盒子的个数
	function countOf(length, numOfBlocks){
		var left = length - numOfBlocks * 3,
		    cache;
		if(numOfBlocks == 1) {
			return (left >=0) ? (left + 1) : 0; // 只有一个盒子时,可放置位置的个数可直接得到。
		}
		else if(numOfBlocks > 1){ // 有多于一个盒子时,先放置一个在某位置,看剩余的位置和盒子有多少种组合
			if((cache = countOf[length + '-' + numOfBlocks]) > 0)
			{
				return cache;
			}
			var count = 0;
			for(var i=0;i<=left;i++){
				count += countOf(length-3-i, numOfBlocks-1);
			}
			countOf[length + '-' + numOfBlocks] = count;
			return count;
		}
	}
})();