├── .idea ├── dictionaries │ └── Luffy.xml ├── jsLibraryMappings.xml ├── misc.xml ├── modules.xml ├── offer-javascript.iml ├── vcs.xml └── watcherTasks.xml ├── 01-findInMatrixArray └── findInMatrixArray.js ├── 02-replaceSpace └── replaceSpace.js ├── 03-printListTailToHead └── printListTailToHead.js ├── 04-rebuildBinaryTree └── rebuildBinaryTree.js ├── 05-arrayToQueue └── arrayToQueue.js ├── 06-minNumberInRotateArray └── minNumberInRotateArray.js ├── 07-fibonacci └── fibonacci.js ├── 08-jumpFloor └── jumpFloor.js ├── 09-rectCover └── rectCover.js ├── 10-numberOf1 └── numberOf1.js ├── 11-doublePower └── doublePower.js ├── 12-reOrderArray └── reOrderArray.js ├── 13-findKthFromTail └── findKthFromTail.js ├── 14-reverseList └── reverseList.js ├── 15-merge └── merge.js ├── 16-HasSubTree └── hasSubTree.js ├── 17-Mirror └── mirror.js ├── 18-printMatrix └── printMatrix.js ├── 19-minArr └── minArr.js ├── 20-isPopOrder └── isPopOrder.js ├── 21-lastOrderTree └── lastOrderTree.js ├── 22-findPath └── findPath.js ├── 23-complexList └── complexList.js ├── 24-permMutation ├── permMutation字符串无重复.js ├── permMutation字符串有重复.js └── test.js ├── 25-MoreThanHalfNum_Solution └── MoreThanHalfNum_Solution.js ├── 26-GetLeastNumbers_Solution └── GetLeastNumbers_Solution.js ├── 27-FindGreatestSumOfSubArray └── FindGreatestSumOfSubArray.js ├── 29-PrintMinNumber └── PrintMinNumber.js ├── 30-GetUglyNumber_Solution └── GetUglyNumber_Solution.js ├── README.md └── 上传操作 /.idea/dictionaries/Luffy.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/jsLibraryMappings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/offer-javascript.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/watcherTasks.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /01-findInMatrixArray/findInMatrixArray.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Luffy on 2017/6/5. 3 | */ 4 | /** 5 | * @param target 目标 6 | * @param array 原数组 7 | * @returns {boolean} 结果,查找到true,未查找到false 8 | *思路 9 | * 因为二维数组排序方式是特别的,从左到右从上到下依次递增,因此采取从左下角或者右上角作为起点去排查 10 | * 每一次排查至少可以去掉一列或者一行或者直接找到元素 11 | */ 12 | function findInMatrix(target, array) { 13 | var row = array.length; // 行数 14 | var col = array[0].length; // 列数 15 | // 从左下角开始比较 16 | var currentRow = row - 1; //当前行数 17 | var currentColumn = 0; //当前所在列数 18 | while(currentRow >= 0 && currentColumn <= col - 1) { // 注意这里有等于号 19 | if (target > array[currentRow][currentColumn]) { 20 | currentColumn++; 21 | } else if (target < array[currentRow][currentColumn]) { 22 | currentRow--; 23 | } else { 24 | return true; //找到目标 25 | } 26 | } 27 | return false; //未找到目标 28 | } -------------------------------------------------------------------------------- /02-replaceSpace/replaceSpace.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Luffy on 2017/6/5. 3 | */ 4 | /** 5 | * 6 | * @param str 目标字符串 7 | * @returns {string|void|XML} 8 | *JavaScript天生优势,正则表达式替换语句,将字符串中的空格替换为%20 9 | */ 10 | function replaceSpace1(str) { 11 | // write code here 12 | //使用JavaScript之中的正则表达式进行替换 13 | return str.replace(/\s/g,'%20'); 14 | } 15 | /** 16 | * 利用字符串拼接特性,临时字符串不断将空格拼接成%20也可以 17 | * @param str 18 | * @returns {string} 19 | */ 20 | function replaceSpace2(str) { 21 | var newString=""; 22 | for(var i=0;i= arr[right]){ 18 | if(right-left == 1){ 19 | mid = right; 20 | break; 21 | } 22 | mid = Math.floor((left+right)/2) 23 | if(arr[mid] >= arr[left]){ 24 | left = mid; 25 | } 26 | else if(arr[mid] < arr[left]){ 27 | right = mid; 28 | } 29 | else if(arr[mid] == arr[right] && arr[mid] == arr[left]){ 30 | return inOrder(arr); 31 | } 32 | } 33 | return arr[mid]; 34 | } 35 | function inOrder(arr){ 36 | var min = arr[0]; 37 | for(var i = 0; i arr[i]){ 39 | min = arr[i]; 40 | } 41 | } 42 | return min; 43 | } -------------------------------------------------------------------------------- /07-fibonacci/fibonacci.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Luffy on 2017/6/8. 3 | */ 4 | /** 5 | * 常规递归解法:时间复杂度以及栈空间不允许,不是好解法 6 | * @param n 7 | * @returns {*} 8 | * @constructor 9 | */ 10 | function Fibonacci(n) 11 | { 12 | // write code here 13 | if(n==0){ 14 | return 0; 15 | } 16 | if(n==1){ 17 | return 1; 18 | } 19 | return Fibonacci(n-2)+Fibonacci(n-1); 20 | } 21 | /** 22 | * 合理解法,只需要把每一次求出来的结果存起来,不断用前两次相加即可。 23 | * @param n 24 | * @returns {number} 25 | * @constructor 26 | */ 27 | function Fibonacci(n) 28 | { 29 | // write code here 30 | if(n==0){ 31 | return 0; 32 | } 33 | if(n==1){ 34 | return 1; 35 | } 36 | var frontOne = 1; //前一个结果也就是f(n-1) 37 | var frontTwo = 0; //前两个结果,也就是f(n-2) 38 | var fiboN = 0; //第n个 39 | for(var i=2;i<=n;i++){ 40 | fiboN = frontOne + frontTwo; //前两个相加 41 | frontTwo = frontOne; //f(n-2) => f(n-1) 42 | frontOne = fiboN; //f(n-1) => f(n) 43 | } 44 | return fiboN; 45 | } -------------------------------------------------------------------------------- /08-jumpFloor/jumpFloor.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Luffy on 2017/6/8. 3 | */ 4 | /** 5 | * 菲波那切数列的变形 6 | * 如果只有一个台阶,只有一种方法,如果有两个台阶,有两种方法 7 | * 当台阶>2时,第一次跳跃有两种不同的选择:第一种跳一个台阶,此时跳法数目等于后面n-1个台阶的跳法数目 8 | * 第二种是第一次跳两个台阶,剩下的跳法数目等于后面n-2个台阶的跳法数目 9 | * 因此:f(n) = f(n-1)+f(n-2) 10 | * @param number 11 | * @returns {number} 12 | */ 13 | function jumpFloor(number) 14 | { 15 | // write code here 16 | if(number == 1){ 17 | return 1; 18 | } 19 | if(number == 2){ 20 | return 2; 21 | } 22 | var frontOne = 2; //前一个结果也就是f(n-1) 23 | var frontTwo = 1; //前两个结果,也就是f(n-2) 24 | var fiboN = 0; //第n个 25 | for(var i=3;i<=number;i++){ 26 | fiboN = frontOne + frontTwo; //前两个相加 27 | frontTwo = frontOne; //f(n-2) => f(n-1) 28 | frontOne = fiboN; //f(n-1) => f(n) 29 | } 30 | return fiboN; 31 | } 32 | /** 33 | * 跳台阶变形,由数学归纳法可以知道,每个台阶对于青蛙来说有两种可能,跳或者不挑 34 | * 因此,n个台阶的跳法应为2的(n-1)次幂 35 | * @param number 36 | * @returns {*} 37 | */ 38 | function jumpFloorII(number) { 39 | if (number < 0) return; 40 | if (number >= 0 && number <= 2) return number; 41 | return 2 * jumpFloorII(number - 1) 42 | } -------------------------------------------------------------------------------- /09-rectCover/rectCover.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Luffy on 2017/6/8. 3 | */ 4 | /** 5 | * 还是斐波那契数列 6 | * 如果第一个小矩形竖着放,则还剩下f(n-1)种摆法 7 | * 如果第一个小矩形横着放,那么对应着下方的也必须是一个横着放的小矩形,右侧就剩下f(n-2)种方法 8 | * @param n 9 | * @returns {*} 10 | */ 11 | function rectCover(n) 12 | { 13 | // write code here 14 | if(n==0){ 15 | return 0; 16 | } 17 | if(n==1 || n==2){ 18 | return n; 19 | } 20 | var frontOne = 2; //前一个结果也就是f(n-1) 21 | var frontTwo = 1; //前两个结果,也就是f(n-2) 22 | var fiboN = 0; //第n个 23 | for(var i=3;i<=number;i++){ 24 | fiboN = frontOne + frontTwo; //前两个相加 25 | frontTwo = frontOne; //f(n-2) => f(n-1) 26 | frontOne = fiboN; //f(n-1) => f(n) 27 | } 28 | return fiboN; 29 | } -------------------------------------------------------------------------------- /10-numberOf1/numberOf1.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Luffy on 2017/6/8. 3 | */ 4 | /** 5 | * 书上的优秀解法,有几个1就循环几次 6 | * @param n 7 | * @returns {number} 8 | * @constructor 9 | */ 10 | function NumberOf1(n) { 11 | var count = 0; 12 | while(n) { 13 | ++count; 14 | n = (n - 1) & n; 15 | } 16 | return count; 17 | } 18 | /** 19 | * 常规解法:从最低位开始循环判断那一位是否为1 20 | * @param n 21 | * @returns {*} 22 | * @constructor 23 | */ 24 | function NumberOf1(n) { 25 | var count = 0; 26 | var flag = 1; 27 | while(flag){ 28 | if(n&flag){ 29 | count++; 30 | } 31 | flag = flag << 1; 32 | } 33 | return count; 34 | } 35 | /** 36 | * javascript特有解法:如果n>0,将n转换成二进制字符串,然后循环判断里面1的个数 37 | * 如果n<0,将负数转换成正确的二进制补码形式在转换成字符串,在循环判断 38 | * @param n 39 | * @returns {*} 40 | * @constructor 41 | */ 42 | function NumberOf1(n) { 43 | // write code here 44 | //-123的二进制表示为-1111011,123的为1111011,因此首先要得到负数二进制的补码表示 45 | //其后面部分的补码0000101 = 122的正码1111011按位取反, 46 | //这个正码加上前面的0即是再全部按位取反即得-123的补码表示 47 | if(n < 0){ 48 | n = -n; 49 | n = n-1; 50 | var str = (Array(32).join("0")+n.toString(2)).slice(-32); 51 | str = exchange(str); 52 | }else{ 53 | var str = (Array(32).join("0")+n.toString(2)).slice(-32); 54 | } 55 | 56 | return cal(str); 57 | } 58 | //计算1的个数 59 | function cal(str){ 60 | var sum = 0; 61 | for(var i = 0; i < str.length; i++){ 62 | if(str[i] == 1){ 63 | sum ++; 64 | } 65 | } 66 | return sum; 67 | } 68 | //如果是负数,0变1,1变0 69 | function exchange(str){ 70 | var arr = str.split(''); 71 | for(var i = 0; i < arr.length; i++){ 72 | if(arr[i] == 0){ 73 | arr[i] = 1; 74 | }else { 75 | arr[i] = 0; 76 | } 77 | } 78 | str = arr.join(""); 79 | return str; 80 | } -------------------------------------------------------------------------------- /11-doublePower/doublePower.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Luffy on 2017/6/8. 3 | */ 4 | /** 5 | * JavaScript方便解法,调用Math函数的pow方法 6 | * @param base 7 | * @param exponent 8 | * @returns {number} 9 | * @constructor 10 | */ 11 | function Power(base, exponent) { 12 | // write code here 13 | return Math.pow(base,exponent); 14 | } 15 | /** 16 | * 常规解法:需要考虑到底数为0以及指数小于0的情况 17 | */ 18 | var INVALID_INPUT = false; //判断输入是否合法 19 | function Power(base,exponent) { 20 | //非法输入,返回0.0 21 | if(equal(base,0.0) && exponent <0){ 22 | INVALID_INPUT = true; 23 | return 0.0; 24 | } 25 | var absExpomemt = Math.abs(exponent); 26 | var result = 1.0; 27 | for(var i = 1;i<=absExpomemt;i++){ 28 | result *= base; 29 | } 30 | if(exponent < 0){ 31 | result = 1.0/result; 32 | } 33 | return result; 34 | } 35 | /** 36 | * javascript中的浮点数减法不是精确的,用一个函数来近似相等 37 | * @param num1 38 | * @param num2 39 | */ 40 | function equal(num1,num2) { 41 | if((num1-num2>-0.0000001)&&(num1-num2)<0.0000001){ 42 | return true; 43 | }else { 44 | return false; 45 | } 46 | } -------------------------------------------------------------------------------- /12-reOrderArray/reOrderArray.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Luffy on 2017/6/13. 3 | */ 4 | /** 5 | * 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 6 | * 思路:利用两个临时数组,一个存奇数,一个存偶数,然后将偶数添加到奇数后面 7 | * @param array 8 | * @returns {*} 9 | */ 10 | function reOrderArray(array) { 11 | // write code here 12 | if(array.length==0||array.length==1){ 13 | return array; 14 | } 15 | var jArr = []; 16 | var oArr = []; 17 | for(var i = 0,len=array.length;i=left;m--){ 35 | result.push(matrix[bottom][m]); 36 | } 37 | } 38 | //从下到上 39 | if(left!=right){ 40 | for(var n=bottom-1;n>top;n--){ 41 | result.push(matrix[n][left]); 42 | } 43 | } 44 | left++; 45 | top++; 46 | right--; 47 | bottom--; 48 | } 49 | return result; 50 | } 51 | console.log(printMatrix(matrix)); -------------------------------------------------------------------------------- /19-minArr/minArr.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Luffy on 2017/7/11. 3 | */ 4 | var arr = []; 5 | function push(node) { 6 | // write code here 7 | arr.push(node); 8 | } 9 | function pop() { 10 | // write code here 11 | return arr.pop(); 12 | } 13 | function top() { 14 | // write code here 15 | return arr[arr.length-1]; 16 | } 17 | function min() { 18 | // write code here 19 | //return Math.min.apply(Math, arr); 20 | return Math.min(...arr); 21 | } -------------------------------------------------------------------------------- /20-isPopOrder/isPopOrder.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Luffy on 2017/7/11. 3 | */ 4 | function IsPopOrder(pushV, popV){ 5 | // write code here 6 | var stack = []; 7 | for(var i=0,j=0;i sequence[n]) 25 | i++; 26 | 27 | if (i < n) return false; 28 | 29 | i = 0; 30 | } 31 | return true; 32 | } -------------------------------------------------------------------------------- /22-findPath/findPath.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Luffy on 2017/7/11. 3 | */ 4 | /* 5 | 思路: 6 | ① 前序遍历二叉树,每次更新当前路径的和 curtSum; 7 | ② 判断当前结点是否是叶子结点,以及 curtSum 是否等于 expectNumber。如果是,把当前路径保存在 res 结果中; 8 | ③ 若不符合条件,则弹出此结点。 9 | */ 10 | function FindPath(root, expectNumber) { 11 | var result = []; 12 | if (root === null) { 13 | return result; 14 | } 15 | dfsFind(root, expectNumber, [], 0, result); 16 | return result; 17 | } 18 | //深度遍历,知道找到一条路径和为目标值,之后将路径push到result中,result中存的是路径数组 19 | function dfsFind(root, expectNumber, path, currentSum, result) { 20 | currentSum += root.val; 21 | path.push(root.val); 22 | if (currentSum == expectNumber && root.left == null && root.right == null) { 23 | result.push(path.slice(0)); 24 | } 25 | if (root.left != null) { 26 | dfsFind(root.left, expectNumber, path, currentSum, result); 27 | } 28 | if (root.right != null) { 29 | dfsFind(root.right, expectNumber, path, currentSum, result); 30 | } 31 | path.pop(); 32 | } -------------------------------------------------------------------------------- /23-complexList/complexList.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Luffy on 2017/7/12. 3 | */ 4 | function RandomListNode(x) { 5 | this.label = x; 6 | this.next = null; 7 | this.random = null; 8 | } 9 | function Clone(pHead) { 10 | if (!pHead) { 11 | return null; 12 | } 13 | // 复制头结点 14 | var node = new RandomListNode(pHead.label); 15 | node.random = pHead.random; 16 | // 递归其他节点 17 | node.next = Clone(pHead.next); 18 | return node; 19 | } -------------------------------------------------------------------------------- /24-permMutation/permMutation字符串无重复.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Luffy on 2017/7/12. 3 | */ 4 | function removeArrRepeat(str) { 5 | var arr = str.split(''); 6 | var repeat = {}; 7 | var resArr = []; 8 | arr.forEach(function (item) { 9 | if(!repeat[item]){ 10 | repeat[item] = true; 11 | resArr.push(item); 12 | } 13 | }) 14 | return resArr.sort(); 15 | } 16 | function swap(arr,ch1,ch2) { 17 | var item = arr[ch1]; 18 | arr[ch1] = arr[ch2]; 19 | arr[ch2] = item; 20 | } 21 | function perm(arr,begin,end,res) { 22 | var result=""; 23 | if(end==begin){ //一到递归的出口就输出数组,此数组为全排列 24 | for(var i=0;i<=end;i++){ 25 | result+=arr[i]; 26 | } 27 | res.push(result); 28 | }else { 29 | for(var j=begin;j<=end;j++){ 30 | swap(arr,begin,j); //for循环将begin~end中的每个数放到begin位置中去 31 | perm(arr,begin+1,end,res); //假设begin位置确定,那么对begin+1~end中的数继续递归 32 | swap(arr,begin,j); //换过去后再还原 33 | } 34 | } 35 | return res; 36 | } 37 | function Permutation(str) { 38 | // write code here 39 | var arr = removeArrRepeat(str); 40 | console.log(perm(arr,0,arr.length-1,[])); 41 | } 42 | Permutation("bac"); -------------------------------------------------------------------------------- /24-permMutation/permMutation字符串有重复.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Luffy on 2017/7/12. 3 | */ 4 | function sortString(arr, sortTemp, res) { 5 | if (arr.length == 0) { 6 | res.push(sortTemp); 7 | } else { 8 | var isRepeat = {}; 9 | for (var i = 0; i < arr.length; i++) { 10 | if (!isRepeat[arr[i]]) { 11 | var temp = arr.splice(i, 1)[0]; // 取出第i个字符 12 | sortTemp+= temp; // 第i个字符设为前缀 13 | sortString(arr, sortTemp, res); 14 | arr.splice(i, 0, temp); // 补全取出的元素,恢复原字符串 15 | sortTemp= sortTemp.slice(0, sortTemp.length - 1); // 清空sortTemp 16 | isRepeat[temp] = true; 17 | } 18 | } 19 | } 20 | return res; 21 | } 22 | function Permutation(str) { 23 | var result = []; 24 | if (str.length <= 0) { 25 | return []; 26 | } 27 | var sortTemp= ""; 28 | var arr = str.split(""); 29 | result = sortString(arr, sortTemp, []); 30 | return result; 31 | } 32 | console.log(Permutation("aac")); -------------------------------------------------------------------------------- /24-permMutation/test.js: -------------------------------------------------------------------------------- 1 | function swap(arr,ch1,ch2) { 2 | var item = arr[ch1]; 3 | arr[ch1] = arr[ch2]; 4 | arr[ch2] = item; 5 | } 6 | function perm(arr,begin,end,res) { 7 | var result=""; 8 | if(end==begin){ //一到递归的出口就输出数组,此数组为全排列 9 | for(var i=0;i<=end;i++){ 10 | result+=arr[i]; 11 | } 12 | res.push(result); 13 | }else { 14 | for(var j=begin;j<=end;j++){ 15 | swap(arr,begin,j); //for循环将begin~end中的每个数放到begin位置中去 16 | perm(arr,begin+1,end,res); //假设begin位置确定,那么对begin+1~end中的数继续递归 17 | swap(arr,begin,j); //换过去后再还原 18 | } 19 | } 20 | return res; 21 | } 22 | function Permutation(str) { 23 | // write code here 24 | var result=[]; 25 | if(str.length==0){ 26 | return result; 27 | } 28 | var arr = str.split("").sort(); 29 | result = perm(arr,0,arr.length-1,[]); 30 | var res = []; 31 | var temp = {}; 32 | result.forEach(function (item) { 33 | if(!temp[item]){ 34 | temp[item] = true; 35 | res.push(item); 36 | } 37 | }) 38 | return res.sort(); //将全排列进行排序,返回需要的结果 39 | } -------------------------------------------------------------------------------- /25-MoreThanHalfNum_Solution/MoreThanHalfNum_Solution.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Luffy on 2017/7/12. 3 | */ 4 | function MoreThanHalfNum_Solution(numbers){ 5 | // write code here 6 | var temp = {}; 7 | var targetCount = 0; 8 | if(numbers.length==0){ 9 | return 0; 10 | } 11 | if(numbers.length==1){ 12 | return numbers[0]; 13 | } 14 | //第一次使用的是targetCount = Math.ceil(numbers.length/2),这个情况如果恰好占一半也会通过 15 | targetCount = Math.floor(numbers.length/2)+1; //此处是关键,如果是偶数,一半是不符合题意的 16 | var result = 0; 17 | numbers.forEach(function(item){ 18 | if(!temp[item]){ 19 | temp[item] = 1; 20 | }else{ 21 | temp[item]++; 22 | if(temp[item]>=targetCount){ 23 | result = item; 24 | } 25 | } 26 | }) 27 | return result; 28 | } 29 | var arr = [4,2,1,4,2,4]; 30 | console.log(MoreThanHalfNum_Solution(arr)); -------------------------------------------------------------------------------- /26-GetLeastNumbers_Solution/GetLeastNumbers_Solution.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Luffy on 2017/7/13. 3 | */ 4 | function GetLeastNumbers_Solution(input, k){ 5 | // write code here 6 | if(k>input.length){ 7 | return []; 8 | } 9 | var arr = input.sort(function (a,b) { //调用数组的排序函数,高阶函数进行整数的排序 10 | return a-b; 11 | }); 12 | return arr.slice(0,k); 13 | } -------------------------------------------------------------------------------- /27-FindGreatestSumOfSubArray/FindGreatestSumOfSubArray.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Luffy on 2017/7/13. 3 | */ 4 | function FindGreatestSumOfSubArray(array){ 5 | // write code here 6 | if(array.length == 0){ 7 | return 0; 8 | } 9 | var sum = array[0]; //总和 10 | var tempSum = array[0]; //临时变量 11 | for(var i=1;i sum) ? tempSum : sum; 18 | } 19 | return sum; 20 | } -------------------------------------------------------------------------------- /29-PrintMinNumber/PrintMinNumber.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Luffy on 2017/7/13. 3 | */ 4 | /* 5 | 思路: 6 | ① 本题关键点是制定排序规则,设计比较器; 7 | ② 排序规则如下: 8 | 若ab > ba 则 a > b, 9 | 若ab < ba 则 a < b, 10 | 若ab = ba 则 a = b; 11 | 1.例如:比较 3 和 31 时,'331' > '313',所以返回结果是 '3' > '31'。 12 | 2.根据指定排序规则对数组进行排序,然后从小到大拼接即为所求结果。 13 | */ 14 | 15 | function Comparator(a, b) { 16 | var s1 = a + "" + b; 17 | var s2 = b + "" + a; 18 | for (var i = 0; i < s1.length; i++) { 19 | if (s1.charAt(i) > s2.charAt(i)) { 20 | return 1; 21 | } 22 | if (s1.charAt(i) < s2.charAt(i)) { 23 | return -1; 24 | } 25 | } 26 | return 1; 27 | } 28 | function PrintMinNumber(numbers) { 29 | numbers.sort(Comparator); 30 | var result = ""; 31 | for (var i = 0; i < numbers.length; i++) { 32 | result = result + numbers[i]; 33 | } 34 | return result; 35 | } -------------------------------------------------------------------------------- /30-GetUglyNumber_Solution/GetUglyNumber_Solution.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Luffy on 2017/7/13. 3 | */ 4 | /* 5 | 思路: 6 | ① 按顺序将丑数保存在数组中,然后求下一个丑数; 7 | ② 下一个丑数是由数组中某个丑数 A * 2,B * 3,C * 5 中的最小值得来的。 8 | ③ 按照题目规定,第一个丑数是 1,存入数组中; 9 | ④ 第二个丑数为 1 * 2,1 * 3,1 * 5 三个中的最小值; 10 | ⑤ 第三个丑数为 2 * 2,1 * 3,1 * 5 三个中的最小值,依次类推,求出第 N 个数组。 11 | */ 12 | 13 | function GetUglyNumber_Solution(index){ 14 | // write code here 15 | if(index == 0){ 16 | return 0; 17 | } 18 | var uglyNum = [1]; 19 | var factor2 = 0,factor3 = 0,factor5 = 0; 20 | for(var i=1;i