字符串删除
描述
给出两个字符串 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的使用