LeetCode每日一练(7)

1.你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币。给定一个数字 n,找出可形成完整阶梯行的总行数。n 是一个非负整数,并且在32位有符号整型的范围内。

示例 1:
n = 5
硬币可排列成以下几行:
¤
¤ ¤
¤ ¤
因为第三行不完整,所以返回2.
示例 2:
n = 8
硬币可排列成以下几行:
¤
¤ ¤
¤ ¤ ¤
¤ ¤
因为第四行不完整,所以返回3.

解答:

i       = 1,       2,        3,         4             
sum = 8, (8-1>2), (7-2>3),(5-3<4)上面的i从1到无穷,也就是可以排列多少台阶。下面是n值的变化,记作sum,sum-i 和 i+1比较,如果sum-i>i+1 就可以排列成下一个台阶,否则不可以排列成下一个台阶

class Solution1 {
    public static int arrangeCoins(int n) {
    	int sum = n;
    	int i = 1;
    	if(n == 0){
    		return 0;
    	}
    	while(sum >= i){
    		sum = sum - i;
    		i++;
    	}
    	return i-1;
    }
}

2.给定一组字符,使用原地算法将其压缩。压缩后的长度必须始终小于或等于原数组长度。数组的每个元素应该是长度为1 的字符(不是 int 整数类型)。在完成原地修改输入数组后,返回数组的新长度。

示例 1:
输入:
["a","a","b","b","c","c","c"]
输出:
返回6,输入数组的前6个字符应该是:["a","2","b","2","c","3"]
说明:
"aa"被"a2"替代。"bb"被"b2"替代。"ccc"被"c3"替代。
示例 2:
输入:
["a"]
输出:
返回1,输入数组的前1个字符应该是:["a"]
说明:
没有任何字符串被替代。
示例 3:
输入:
["a","b","b","b","b","b","b","b","b","b","b","b","b"]
输出:
返回4,输入数组的前4个字符应该是:["a","b","1","2"]。
说明:
由于字符"a"不重复,所以不会被压缩。"bbbbbbbbbbbb"被“b12”替代。
注意每个数字在数组中都有它自己的位置

答案:利用滑动窗口法,左右指针起点都为原数组的首位。
实现步骤如下:不断右移右指针,使窗口不断增大;当窗口内出现一个不同的元素时,就可以将元素及其数量(等于左右指针之差)更新在数组中,然后让左指针指向右指针;遍历到最后一个字符时也需要结算,因此将右指针的终点设为数组之外一格。当右指针移到终点时也要更新数组。

class Solution {
    public int compress(char[] chars) {     
// 数组大小范围: 1 <= chars.length <= 1000
        int left = 0;
        int size = 0;
        
        // 由于最后一个字符也需要判断,所以将右指针终点放到数组之外一格
        for (int right = 0; right <= chars.length; right++) {
            // 当遍历完成,或右指针元素不等于左指针元素时,更新数组
            if (right == chars.length || chars[right] != chars[left]) {
                chars[size++] = chars[left];    // 更新字符
                if (right - left > 1) {         // 更新计数,当个数大于 1 时才更新
                    for(char c : String.valueOf(right - left).toCharArray()) {
                        chars[size++] = c;
                    }
                }
                left = right;
            }
        }
        
        return size;
    }
}

 

你可能感兴趣的:(leetcode)