トピック
このセット には から まで の 整数が
s
含まれます 。残念ながら、データ エラーにより、セット内の数値がセット内の別の数値の値にコピーされ、セットの 数値が失われ 、 重複した数値が発生してしまいました 。1
n
エラーのコレクションの結果
nums
を表す 配列が与えられます 。S
繰り返し現れる整数を見つけて、欠落している整数を見つけて、それらを配列の形式で返してください。
それは次のようなものでしょうか:シンプル
トピック
リンク: 645. エラー集
例 1:
入力: nums = [1,2,2,4] 出力: [2,3]
例 2:
入力: nums = [1,1] 出力: [1,2]
ヒント:
2 <= nums.length <= 104
1 <= nums[i] <= 104
質問分析
質問によれば、集合 s [1, n] 内の 1 つの要素が繰り返され、1 つの要素が欠落していることがわかります。質問では、配列 (つまり、繰り返される要素と欠落している要素) を返す必要があります。まず繰り返される要素を見つけてから、欠落している要素を見つけます。この方法の解決策は比較的簡単です。
コード表示
int* findErrorNums(int* nums, int numsSize, int* returnSize) {
int* arr = (int*)malloc(sizeof(int) * 2);
int i = 0; int j = 0;
//找出复的数组元素
for (i = 0; i < numsSize; i++)
{
for (j = i + 1; j < numsSize; j++)
{
if (nums[i] == nums[j])
{
arr[0] = nums[i];
}
}
}
//找出丢失的元素
int arr2[10001] = { 0 };//创建临时数组
//元素置零
for (i = 0; i < numsSize; i++)
{
arr2[i] = 0;
}
int x = 0;
for (i = 0; i < numsSize; i++)
{
x = nums[i] % (numsSize + 1);
arr2[x - 1] = x;
}
j = 0;
for (i = 1; i <= numsSize; i++)
{
if (arr2[i - 1] == 0)//遍历临时数组
{
arr[1] = i;
}
}
*returnSize = 2;
return arr;
}
質問の超詳細な分析
1. 繰り返される要素を見つける
ここで使用されているのは 2 層の for ループで、外側のループは最初の要素を通過し、内側のループの初期条件は 2 番目の要素になります。
これは私たちのアイデアであり、最初の要素を 2 番目の要素と 3 番目の要素と比較し、次に次の要素をその下にある他の要素と比較します (重複要素が見つかるまで)。
図
2. 不足している要素を見つける
ここで求められる欠落要素は、単純なアイデアとして、一時配列 (配列内のすべての要素が 0 に設定される) を使用して、配列要素 [1, n] を対応する配列 (つまり、対応する配列の添字付き) に格納するというものです。同様に) [例] 要素 1 は一時配列の添字 1 に格納され、要素 5 は一時配列の添字 5 に配置されます。
次に、サイズ numsSize の配列を走査します。ゼロの要素 (要素が 1 つだけ欠落しているため) が、欠落している配列です。
ここにある上記のテキストが非常に理解できる場合は、読んでください。
Leetcode:【448. 配列内の欠落している数値をすべて見つける】解決策
図