js面试领扣小题


字符串删除

描述
给出两个字符串 str 和 sub,你的任务是在 str 中完全删除那些在 sub 中存在的字符。

字符串中包含空格
1≤len(str),len(sub)≤10^5

样例

样例 1:
输入: str=“They are students”,sub=“aeiou”
输出: “Thy r stdnts”
代码

export class Solution {
  /**
   * CharacterDeletion
   *
   * @param str: The first string given
   * @param sub: The given second string
   * @return: Returns the deleted string
   */
  CharacterDeletion(str, sub) {
    // write your code here
    let reg = new RegExp('['+sub+']','g');
    str = str.replace(reg,'');
    return str;
  }
  
}

购买通行证

描述
亚历克斯计划参观博物馆,并在柜台购买相同的通行证。管理员决定不出售团体通行证,一次只提供一张通行证。如果访客需要一张以上的通行证,他/她必须再次重新排队到柜台并购买下一张通行证。亚历克斯想购买许多通行证。访客顺序和每位访客需要的通行证数量是已知的,亚历克斯需要多少时间才能买到所有的通行证?Alex在队列中的位置将被给定,每次交易需要1个时间单位。可以忽略每次转到行后面所需的时间。

|arr|<=100000
arr[i]<=10000

样例

样例 1:
输入: arr=[1,2,5],k=1
输出: 4
解释:
有3个人 0,1,2 在排队。亚历克斯的编号是1
第一个时间点,队列为0(1)<-1(2)<-2(5),编号0获得门票。
第二个时间点,队列为1(2)<-2(5) 亚克斯获得门票,并返回队伍最末端
第三个时间点,队列为2(5)<-1(1) 编号2获得门票,并返回队伍最末端
第四个时间点,队列为1(1)<-2(4) 亚克斯获得门票,他已经买到了所需要的所有门票

样例 2:
输入: arr=[3,2,1], k = 0,
输出: 6
代码:

export class Solution {

  /**
   * buyPasses
   *
   * @param arr: the line 
   * @param k: Alex place
   * @return: the time when Alex requires to buy all passes
   */
  buyPasses(arr, k) {
    // Write your code here.
    let cur = 0;
    let next = cur+1;
    let len = arr.length;
    let ret = 0;
    while(arr[k]){
        if(arr[cur]!==0){
            arr[cur]--;
            ret ++;
        }
        cur = next;
        if(next === len-1){
            next = 0;
        }else{
            next++;
        }
    }
    return ret;
  }
  
}

数组划分

描述
给出一个整数数组 nums 和一个整数 k。划分数组(即移动数组 nums 中的元素),使得:
所有小于k的元素移到左边
所有大于等于k的元素移到右边
返回数组划分的位置,即数组中第一个位置 i,满足 nums[i] 大于等于 k。

你应该真正的划分数组 nums,而不仅仅只是计算比 k 小的整数数,如果数组 nums 中的所有元素都比 k 小,则返回nums.length。 0 <= nums.length <= 2000

样例

样例 1:
输入:
nums = []
k = 9
输出: 0

解释:
空数组,输出0

样例 2:
输入:
nums = [3,2,2,1]
k = 2
输出: 1

解释:
真实的数组为[1,2,2,3].所以返回 1

挑战
使用 O(n) 的时间复杂度在数组上进行划分。

export class Solution {

  /**
   * partitionArray
   *
   * @param nums: The integer array you should partition
   * @param k: An integer
   * @return: The index after partition
   */
  partitionArray(nums, k) {
    // write your code here
    let len = nums.length;
    if(len === 0) return 0;
    let left = 0;
    let right = len - 1;
    let temp;
    while(left <= right)
    {
        while(left <= right && nums[left] < k) left++;
        while(left <= right && nums[right] >= k) right--;
        if(left >= right) return left;
        if(left <= right){
            temp = nums[left];
            nums[left++] = nums[right];
            nums[right--] = temp;
        }
        
    }
    return left;
  }

}

寻找峰值

描述
给定一个整数数组(size为n),其具有以下特点:

相邻位置的数字是不同的
A[0] < A[1]并且 A[n - 2] > A[n - 1]
假定P是峰值的位置则满足A[P] > A[P-1]且A[P] > A[P+1],返回数组中任意一个峰值的位置。
数组保证至少存在一个峰
如果数组存在多个峰,返回其中任意一个就行
数组至少包含 3 个数

样例

样例 1:
输入: A = [1, 2, 1, 3, 4, 5, 7, 6]
输出: 1

解释:
返回任意一个峰顶元素的下标,6也同样正确。

样例 2:
输入: A = [1,2,3,4,1]
输出: 3

解释:
返回峰顶元素的下标。

挑战
时间复杂度O (logN)

export class Solution {

  /**
   * findPeak
   *
   * @param A: An integers array.
   * @return: return any of peek positions.
   */
//暴力解法
//   findPeak(A) {
//     // write your code here
//     let len = A.length,i;
//     for(i = 1;i < len - 1;i++){
//         if(A[i] > A[i - 1] && A[i] > A[i + 1]){
//             return i;
//         }
//     }
//   }
//二分法
  findPeak(A) {
    let left = 0, right = A.length - 1;
    while (left + 1 < right) {
        let mid = Math.floor((left + right) / 2);
        // 因为随意一个峰都可以 所以比 A[mid] 就好了
        if (A[mid - 1] < A[mid])
            left = mid;
        else
            right = mid;
    }
    return A[left] > A[right] ? left : right;
  }
  
}

总结

提示:这里对文章进行总结:
例如:以上就是本文内容,本文仅仅简单列出js的使用

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用二查找算法来解决这个问题。 首先,我们可以将两个数组合并成一个有序数组,然后求出中位数。但是,这个方法的时间复杂度为 $O(m + n)$,不符合题目要求。因此,我们需要寻找一种更快的方法。 我们可以使用二查找算法在两个数组中别找到一个位置,使得这个位置将两个数组成的左右两部的元素个数之和相等,或者两部的元素个数之差不超过 1。这个位置就是中位数所在的位置。 具体来说,我们别在两个数组中二查找,假设现在在第一个数组中找到了一个位置 $i$,那么在第二个数组中对应的位置就是 $(m + n + 1) / 2 - i$。如果 $i$ 左边的元素个数加上 $(m + n + 1) / 2 - i$ 左边的元素个数等于 $m$ 个,或者 $i$ 左边的元素个数加上 $(m + n + 1) / 2 - i$ 左边的元素个数等于 $m + 1$ 个,则这个位置就是中位数所在的位置。 具体的实现可以参考以下 Java 代码: ```java public double findMedianSortedArrays(int[] nums1, int[] nums2) { int m = nums1.length, n = nums2.length; if (m > n) { // 保证第一个数组不大于第二个数组 int[] tmp = nums1; nums1 = nums2; nums2 = tmp; int t = m; m = n; n = t; } int imin = 0, imax = m, halfLen = (m + n + 1) / 2; while (imin <= imax) { int i = (imin + imax) / 2; int j = halfLen - i; if (i < imax && nums2[j - 1] > nums1[i]) { imin = i + 1; // i 太小了,增大 i } else if (i > imin && nums1[i - 1] > nums2[j]) { imax = i - 1; // i 太大了,减小 i } else { // i 是合适的位置 int maxLeft = 0; if (i == 0) { // nums1 的左边没有元素 maxLeft = nums2[j - 1]; } else if (j == 0) { // nums2 的左边没有元素 maxLeft = nums1[i - 1]; } else { maxLeft = Math.max(nums1[i - 1], nums2[j - 1]); } if ((m + n) % 2 == 1) { // 总元素个数是奇数 return maxLeft; } int minRight = 0; if (i == m) { // nums1 的右边没有元素 minRight = nums2[j]; } else if (j == n) { // nums2 的右边没有元素 minRight = nums1[i]; } else { minRight = Math.min(nums1[i], nums2[j]); } return (maxLeft + minRight) / 2.0; } } return 0.0; } ``` 时间复杂度为 $O(\log\min(m, n))$。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值