题目:你总共有 n 枚硬币,并计划将它们按阶梯状排列。对于一个由 k 行组成的阶梯,其第 i 行必须正好有 i 枚硬币。 阶梯的最后一行 可能 是不完整的。
给你一个数字 n ,计算并返回可形成 完整阶梯行 的总行数。
示例 1: 输入:n = 5 输出:2 解释:因为第三行不完整,所以返回 2 。
示例 2: 输入:n = 8 输出:3 解释:因为第四行不完整,所以返回 3 。
int arrangeCoins(int n)
{
//i即表示第i行,又表示第i行有几个硬币;i一开始默认为第一行
int i = 1;
while (n > 0)
{
//n每次减去i,如果n减完等于0,说明正好够减,这一行刚好完整,就返回这一层
//如果n减完i小于0,说明上一层减完i剩下的n不够这一行的i减,所以这一行是不完整的,要返回上一层
n -= i;
if (n == 0)
return i;
else if (n < 0)
return i - 1;
//每循环一次就进入下一层
i++;
}
return 0;
}
给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间[1, n] 内。 请你找出所有在[1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。
示例 1: 输入:nums = [4, 3, 2, 7, 8, 2, 3, 1] 输出:[5, 6]
示例 2: 输入:nums = [1, 1] 输出:[2]
提示: n == nums.length 1 <= n <= 10^5 1 <= nums[i] <= n
int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize)
{
int* ans = (int*)malloc(sizeof(int) * numsSize);
int len = 0;
int hash[100000] = { 0 };
//遍历这个数组,以数组中的元素作为hash数组的下标,并赋予1,表明这个数已经出现过
for (int i = 0; i < numsSize; i++)
{
hash[nums[i]] = 1;
}
//遍历hash数组的下标,从1到数组的长度,如果有等于0的,说明在数组中没出现过,返回这个下标
for (int i = 1; i <= numsSize; i++)
{
if (hash[i] == 0)
{
ans[len++] = i;
}
}
//返回长度
*returnSize = len;
return ans;
}