├── .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 |
5 |
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