アレイ関連のインタビュー質問の要約

これは、LeetCodeの配列に関するいくつかの質問についてです

1.アレイ内のすべての要素valを所定の位置に削除します。
ここに写真の説明を挿入
アイデア:ダブルポインタートラバーサル、idxおよびi、iはvalと等しくないため、右の次のビットに移動します。これは、監視後のコードはメモリに適用されますが、メモリを適用できないという問題があるためです。 Likouコンパイラがコンパイルされました

int removeElement(int* nums, int numsSize, int val)
{
    
    
//int* newA=(int*)malloc(numsSize*sizeof(int));
int idx=0;
for(i=0;i<numsSize;++i)
{
    
    
if(nums[i]!=val)
nums[idx++]=nums[i];
}
//memcpy(nums,newA,sizeof(int)*idx);
//free(newA);
return idx;
}

2.ソートされた配列内の重複を削除します。
ここに写真の説明を挿入
この質問考え方は、依然としてダブルポインター、O(n)の複雑さであり、余分な配列スペースは使用されません。

int removeDuplicates(int* nums, int numsSize)
{
    
    
int idx=0;
int i=0;
int j=0;
while(j<numsSize)
{
    
    
   nums[idx++]=nums[i];
   if(nums[i]!=nums[j])
   {
    
    
       ++i;
       ++j;
   }
   else
   {
    
    
       //找到下一个不同元素位置
       while(j<numsSize&&nums[i]==nums[j])
       ++j;
       i=j;
       ++j;
   }
}
if(i<numsSize)
nums[idx++]=nums[i];
return idx;
}

3.2つの順序付けられた配列をマージします
ここに写真の説明を挿入

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
    
    
//从后向前合并
int idx=m+n-1;
while(m>0&&n>0)
{
    
    
    if(nums1[m-1]>=nums2[n-1])
    {
    
    
        nums1[idx--]=nums1[m-1];
        --m;
    }
    else
    {
    
    
        nums1[idx--]=nums2[n-1];
        --n;
    }
    }
    if(n>0)
    {
    
    
        memcpy(nums1,nums2,sizeof(int)*n);
    }
}

4.アレイを回転させます(2つのソリューション:左利きと右利き)
ここに写真の説明を挿入
ソリューション1:

void reverse(int* nums,int left,int right)
{
    
    
    while(left<right)
    {
    
    
        int tmp=nums[left];
        nums[left]=nums[right];
        nums[right]=tmp;
        ++left;
        --right;
    }
}
void rotate(int* nums, int numsSize, int k)
{
    
    
    k%=numsSize;
    //右旋
    reverse(nums,0,numsSize-1);
    reverse(nums,0,k-1);
    reverse(nums,k,numsSize-1);
}

解決策2:

void reverse(int* nums,int left,int right)
{
    
    
    while(left<right)
    {
    
    
        int tmp=nums[left];
        nums[left]=nums[right];
        nums[right]=tmp;
        ++left;
        --right;
    }
}
void rotate(int* nums, int numsSize, int k)
{
    
    
   //左旋
    k%=numsSize;
     reverse(nums,0,numsSize-k-1);
     reverse(nums,numsSize-k,numsSize-1);
     reverse(nums,0,numsSize-1);
 }
 //左旋两次相当于右旋五次

5.配列形式の整数加算。私は
ここに写真の説明を挿入
この質問に長い間悩まされきました。

まず
、追加した整数の桁数を決定します。2つの数値を追加して、新しく作成した配列に格納します。配列を
直接反転します。
重要なのは、追加するときにキャリーを考慮することです。

ここに写真の説明を挿入

void reverse(int* nums,int left,int right)
 {
    
    
     while(left<right)
     {
    
    
     int tmp=nums[left];
     nums[left]=nums[right];
     nums[right]=tmp;
     ++left;
     --right;
     }

 }
int* addToArrayForm(int* A, int ASize, int K, int* returnSize)
{
    
    
//把数字的数组形式转化成整数
//整数相加
//整数转成数组形式
//上面的不可行 如果碰上大数 

//获取最大位数
int tmp=K;
int knum=0;
while(tmp)
{
    
    
    knum++;
    tmp/=10;
}
//开空间考虑最高进位
int newArraySize = ASize > knum ? ASize+1 : knum+1;
int* newArray=(int*)malloc(sizeof(int)*newArraySize);
//模拟加法运算,从低位开始相加
int i=0;
int idx=ASize-1;
int step=0;
while(idx>=0||K>0)
{
    
    
    newArray[i] = step;
    if(idx>=0)
    newArray[i]+=A[idx];
    if(K>0)
    newArray[i]+=K%10;
    //更新进位
    if(newArray[i]>9)
    {
    
    
        newArray[i]-=10;
        step=1;
    }
    else
    step=0;
    //继续下一位的加法运算
    --idx;
    K /= 10;
    i++;
}
//判断最高位是否有进位
if(step==1)
   newArray[i++]=1;

   //逆转
   reverse(newArray,0,i-1);
   *returnSize = i;
   return newArray;
}

おすすめ

転載: blog.csdn.net/qq_45657288/article/details/109107140