【NO.2】LeetCode经典150题-27. 移除元素

【NO.2】LeetCode经典150题-27. 移除元素

27. 移除元素

【简单】

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。

假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:

  • 更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
  • 返回 k

用户评测:

评测机将使用以下代码测试您的解决方案:

int[] nums = [...]; // 输入数组
int val = ...; // 要移除的值
int[] expectedNums = [...]; // 长度正确的预期答案。
                            // 它以不等于 val 的值排序。

int k = removeElement(nums, val); // 调用你的实现

assert k == expectedNums.length;
sort(nums, 0, k); // 排序 nums 的前 k 个元素
for (int i = 0; i < actualLength; i++) {
    assert nums[i] == expectedNums[i];
}

如果所有的断言都通过,你的解决方案将会 通过

示例 1:

输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2,,]
解释:你的函数函数应该返回 k = 2, 并且 nums 中的前两个元素均为 2。
你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。

示例 2:

输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,4,0,3,,,_]
解释:你的函数应该返回 k = 5,并且 nums 中的前五个元素为 0,0,1,3,4。
注意这五个元素可以任意顺序返回。
你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。

提示:

  • 0 <= nums.length <= 100
  • 0 <= nums[i] <= 50
  • 0 <= val <= 100

解题

题意有说:元素的顺序可以改变。可以直接把最后的元素放到删除的位置上。所以一趟遍历就可以了。

// 时间复杂度:O(n)
// 空间复杂度:O(1)
class Solution {
    public int removeElement(int[] nums, int val) {
        // 注意题意有说:元素的顺序可以改变。
        // 可以直接把最后的元素 放到 删除的位置上(直接覆盖)
        int left = 0;
        int right = nums.length-1;
        while (left <= right) {
            if (nums[left] == val) {
                nums[left] = nums[right];
                right--;
            } else {
                left++;
            }
        }

        return left;
    }
}
输入n(3≤n≤2×)和长为n 的数组a(1≤a[i]≤1×)。你需要从a 中恰好删 除一个数,得到长为 n-1 的数组a' 。然后生成一个长为 n-2 的数组b, 其中 b[i]-GCD (a ' [i],a ' [i+1]) 。你需要让数组b 是非降序列,即 b[ i ] ≤ b [ i+1] 。能否做到?输出 YES 或 NO。 (提示:枚举i,考察删除a[i] 后对b 数组产生的影响。) 01 #include <bits/stdc++.h> 02 using namespace std; 03 04 int gcd( int x, int y ) 05{ 06 return ! y ? × : gcd( y, x % y) ; 07} 08 09 void solve() 10{ 11 int n; 12 cin >> n; 13 vector<int> a (n + 1) ,b(n + 2); 14 for(int i=1 ; i<=n ; i++) 15 cin >> a[i]; 16 b [ n ] = b [n+1] = ① ; 17 for(int i=1; i < n; i++) 18 b [ i ] = gcd ( a[i] , a[i+1] ); 19 vector < int > pre(n +1) , suf ( n+2); 20 pre [ 0 ] = 1; 21 for(int i = 1 ; i < = n ; i++ ) 22 pre [i] = pre[i-1] && (②); 23 suf [n+1] =1; 24 for ( int i = n ; i> = 1; i-- ) 25 suf [i] = suf [i+1]&& (b[i] < = b [i+1]); 26 bool flag = ③; 27 for(int i =2 ; i < n ; i++) 28 { 29 int cur = ④; 30 if( ⑤ && b [i-2] <= cur && cur <= b [i+1] ) 31 flag = true; 32 } 33 cout << ( flag ? "YES\n" : "NO\n"); 34 return; 35 } 36 37 int main( ) 38{ 39 int t =1; 40 //cin >>t; 41 while ( t - - ) 42 solve( ); 43 } 33.①处应填( ) A.0 B. 3E9 C. -1E9 D. 2E9 34.②处应填( )。 A.b[i]>=b[i-1] B.b[i]<=b[i-1] C.b[i]>b[i-1] D.b[i]<b[i-1] 35.③处应填( )。 A.pre[n-2] & suf[2] C.pre[n-2] ^ suf[2] B.pre[n-2] | suf[2] D.pre[n-2]- suf[2] 36.④处应填( )。 A.gcd(a[i],b[i]) C.gcd(a[i-1],a[i+1]) B.gcd(a[i],a[i+1]) D.gcd(a[i-1],a[i] 37.⑤处应填( ) A.pre[i-2] && suf[i+1] C.pre[i-2] || suf[i+1] B.pre[i-1] && suf[i+1] D.pre[i-1] || suf[i+1]
最新发布
09-14
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悬浮海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值