力扣面试经典题之数组/字符串

发布时间:2023年12月20日

88. 合并两个有序数组

简单

给你两个按?非递减顺序?排列的整数数组?nums1?和?nums2,另有两个整数?m?和?n?,分别表示?nums1?和?nums2?中的元素数目。

请你?合并?nums2?到?nums1?中,使合并后的数组同样按?非递减顺序?排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组?nums1?中。为了应对这种情况,nums1?的初始长度为?m + n,其中前?m?个元素表示应合并的元素,后?n?个元素为?0?,应忽略。nums2?的长度为?n?。

示例 1:

输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
解释:需要合并 [1,2,3] 和 [2,5,6] 。
合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。

示例 2:

输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]
解释:需要合并 [1] 和 [] 。
合并结果是 [1] 。

示例 3:

输入:nums1 = [0], m = 0, nums2 = [1], n = 1
输出:[1]
解释:需要合并的数组是 [] 和 [1] 。
合并结果是 [1] 。
注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。

提示:

  • nums1.length == m + n
  • nums2.length == n
  • 0 <= m, n <= 200
  • 1 <= m + n <= 200
  • -109 <= nums1[i], nums2[j] <= 109
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    int i=0,j=0,re[m+n+1],k=0;
    while(true){
     if(i<m&&j<n){
        if(nums1[i]>nums2[j]){
          re[k++]=nums2[j++];
        }
        else{
          re[k++]=nums1[i++];  
       }
      }else if(i==m&&j<n){
         re[k++]=nums2[j++];
      }else if(j==n&&i<m){
           re[k++]=nums1[i++];
      }
      else{
          break;
      } 
    }
    for(int i=0;i<m+n;i++){
        nums1[i]=re[i];
    }

    
}

27. 移除元素

简单

给你一个数组?nums?和一个值?val,你需要?原地?移除所有数值等于?val?的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用?O(1)?额外空间并?原地?修改输入数组

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

说明:

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝
int len = removeElement(nums, val);

// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {
? ? print(nums[i]);
}

示例 1:

输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。

示例 2:

输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,3,0,4]
解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。

提示:

  • 0 <= nums.length <= 100
  • 0 <= nums[i] <= 50
  • 0 <= val <= 100
int removeElement(int* nums, int numsSize, int val) {
    for(int i=0;i<numsSize;){
        if(nums[i]==val){
            for(int j=i;j<numsSize-1;j++){
                nums[j]=nums[j+1];
            }
            numsSize--;
        }else{
            i++;
        }
    }
    return numsSize;
}

26. 删除有序数组中的重复项

已解答

简单

相关标签

相关企业

提示

给你一个?非严格递增排列?的数组?nums?,请你?原地?删除重复出现的元素,使每个元素?只出现一次?,返回删除后数组的新长度。元素的?相对顺序?应该保持?一致?。然后返回?nums?中唯一元素的个数。

考虑?nums?的唯一元素的数量为?k?,你需要做以下事情确保你的题解可以被通过:

  • 更改数组?nums?,使?nums?的前?k?个元素包含唯一元素,并按照它们最初在?nums?中出现的顺序排列。nums?的其余元素与?nums?的大小不重要。
  • 返回?k?。

判题标准:

系统会用下面的代码来测试你的题解:

int[] nums = [...]; // 输入数组
int[] expectedNums = [...]; // 长度正确的期望答案

int k = removeDuplicates(nums); // 调用

assert k == expectedNums.length;
for (int i = 0; i < k; i++) {
    assert nums[i] == expectedNums[i];
}

如果所有断言都通过,那么您的题解将被?通过

示例 1:

输入:nums = [1,1,2]
输出:2, nums = [1,2,_]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。

示例 2:

输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。

提示:

  • 1 <= nums.length <= 3 * 104
  • -104 <= nums[i] <= 104
  • nums?已按?非严格递增?排列
int removeDuplicates(int* nums, int numsSize) {
    for(int i=0;i<numsSize-1;){
        if(nums[i]==nums[i+1]){
              for(int j=i+1;j<numsSize-1;j++){
                  nums[j]=nums[j+1];
              }
              numsSize--;
        }else{
            i++;
        }
    }
    return numsSize;
    
}

80. 删除有序数组中的重复项 II

中等

给你一个有序数组?nums?,请你?原地?删除重复出现的元素,使得出现次数超过两次的元素只出现两次?,返回删除后数组的新长度。

不要使用额外的数组空间,你必须在?原地?修改输入数组?并在使用 O(1) 额外空间的条件下完成。

说明:

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);

// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {
? ? print(nums[i]);
}

示例 1:

输入:nums = [1,1,1,2,2,3]
输出:5, nums = [1,1,2,2,3]
解释:函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3。 不需要考虑数组中超出新长度后面的元素。

示例 2:

输入:nums = [0,0,1,1,1,1,2,3,3]
输出:7, nums = [0,0,1,1,2,3,3]
解释:函数应返回新长度 length = 7, 并且原数组的前五个元素被修改为?0, 0, 1, 1, 2, 3, 3。不需要考虑数组中超出新长度后面的元素。

提示:

  • 1 <= nums.length <= 3 * 104
  • -104 <= nums[i] <= 104
  • nums?已按升序排列
int removeDuplicates(int* nums, int numsSize) {
    int pre=0;
    for(int i=1;i<numsSize;){
        if(nums[i]>nums[pre]){
            nums[++pre]=nums[i];
            i++;
        }else{
            nums[++pre]=nums[i];
          int k;
          for(k=i+1;k<numsSize;k++){
              if(nums[k]!=nums[i]){  
                  break;
              }
          }
          i=k;
         
        }
    }
    return pre+1;
}

169. 多数元素

简单

给定一个大小为?n?的数组?nums?,返回其中的多数元素。多数元素是指在数组中出现次数?大于?? n/2 ??的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例?1:

输入:nums = [3,2,3]
输出:3

示例?2:

输入:nums = [2,2,1,1,1,2,2]
输出:2

提示:

  • n == nums.length
  • 1 <= n <= 5 * 104
  • -109 <= nums[i] <= 109
#include<stdlib.h>
int cmp(const void *a,const void *b){
    return *(int *)a-*(int *)b;
}
int majorityElement(int* nums, int numsSize) {
    int mm;
    mm=numsSize/2;
    qsort(nums,numsSize,sizeof(nums[0]),cmp);
    for(int i=0;i<numsSize;){
        int k=0,j;
        for(j=i+1;j<numsSize;j++){
            if(nums[i]!=nums[j]){
                break;
            }
        }
        if((j-i)>mm){
          return nums[i];
        }else{
            i=j;
        }

    }
    return 0;
}

?

文章来源:https://blog.csdn.net/weixin_63357306/article/details/135103954
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。