代码随想录第七天

前言

今天是投机取巧的一天,用js自带的函数,可以解决大部分。

344.反转字符串

解题思路
这道题比较简单,第一时间想到了双指针,头尾互换字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

示例 1:
输入:[“h”,“e”,“l”,“l”,“o”]
输出:[“o”,“l”,“l”,“e”,“h”]

示例 2:
输入:[“H”,“a”,“n”,“n”,“a”,“h”]
输出:[“h”,“a”,“n”,“n”,“a”,“H”]

双指针

var reverseString = function(s) {

    // 双指针
    let left=0;
    let right=s.length-1;
    while(left<right){
        let str=s[left]
        s[left]=s[right]
        s[right]=str
        left++
        right--
    }
    return s
};

541. 反转字符串II

解题思路
这道题第一次做,还是有点没想通,看了卡哥视频之后,还是理解了的,就是还得多练。

给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。

如果剩余字符少于 k 个,则将剩余字符全部反转。

如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

示例:

输入: s = “abcdefg”, k = 2
输出: “bacdfeg”

双指针

var reverseStr = function(s, k) {
   const n = s.length;
    const arr =[...s];
    for (let i = 0; i < n; i += 2 * k) { //2k为步长
        let left = i
        let right=Math.min(i + k, n) - 1 //获取右边界
        while (left < right) {
            const temp = arr[left];
            arr[left] = arr[right];
            arr[right] = temp;
            left++;
            right--;
        }


    }
    return arr.join('');
};

题目:剑指Offer 05.替换空格

解题思路
第一时间想到的就是变成一个数组,然后去遍历数组,遇到空格,直接就替换,有点投机取巧。

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

示例 1: 输入:s = “We are happy.”
输出:“We%20are%20happy.”

直接遍历替换

var replaceSpace = function(s) {
    
    const arr=[...s]
    for(let i=0;i<arr.length;i++){
         if(arr[i]===' '){
             arr[i]='%20'
         }
     }
     return arr.join('')
};

双指针扩充数组替换

var replaceSpace = function(s) {
let count =0
for(let i=0; i<s.length;i++){
    if(arr[i]===' '){
        count++
    }
}
let length=arr.length-1;
let nlength=arr.length+count*2-1 //新数组的长度

while(length>=0){
    if(arr[length]!==' '){ //原数组长度的最后一个元素如果不是空格,则放到数组最新长度的最后一位
        arr[nlength]=arr[length]
    }else{
        arr[nlength]='0'
        arr[nlength-1]='2'
        arr[nlength-2]='%'
        nlength-=2
    }
    length--
    nlength--
}
return arr.join('')
}

151.翻转字符串里的单词

解题思路
看到leetcode官网的js版本代码,极致取巧了属于是,相比之下我自己写的居然还不够取巧。

给定一个字符串,逐个翻转字符串中的每个单词。

示例 1:
输入: “the sky is blue”
输出: “blue is sky the”

示例 2:
输入: " hello world! "
输出: “world! hello”
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。

示例 3:
输入: “a good example”
输出: “example good a”
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

极致取巧版本

var reverseWords = function(s) {
    return s.trim().split(/\s+/).reverse().join(' ');
};

自己写的一般取巧版本

vvar reverseWords = function(s) {
    const arr=s.split(' ')
    let left = 0;
    let right = arr.length-1
    for(let i=left;i<=right;i++){
        if(arr[i]=== '') {
           arr.splice(i,1)
           i--
           right--
           continue
        }
        if(arr[right]=== ''){
            arr.splice(right,1)
            right--
            i--
            continue
        }
        let temp=arr[i]
        arr[i]=arr[right]
        arr[right]=temp
        right--
    }
   return arr.join(' ')
};

题目:剑指Offer58-II.左旋转字符串

解题思路

还是取巧的一题,第一次做直接用了substr进行字符串拼接,就一行代码。第二次做转成数组循环出来哪个字符串,最后拼接在一起。

substr拼接

var reverseLeftWords = function(s, n) {
    // 极致取巧
   return s.substr(n)+s.substr(0,n)


};

转成数组循环拼接

var reverseLeftWords = function(s, n) {
 
// 转换拼接
    const arr=[]
    for(let i=n;i<s.length;i++){
        arr.push(s[i])
    }
    for(let i=0;i<n;i++){
        arr.push(s[i])
    }

    return arr.join('')
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值