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;
}
}