当前位置: 首页 > news >正文

阿里云编辑建设好的网站济南做网站公司

阿里云编辑建设好的网站,济南做网站公司,wordpress 剪切板图片自动上传,电影网站开发教程主要记录算法和数据结构学习笔记,新的一年更上一层楼! 初级算法-字符串一、反转字符串二、反转字符串(二)三、替换空格四、翻转字符串里的单词五、左旋转字符串六、实现 strStr()七、重复的子字符串字符串中元素只能是字符String…

主要记录算法和数据结构学习笔记,新的一年更上一层楼!

初级算法-字符串

  • 一、反转字符串
  • 二、反转字符串(二)
  • 三、替换空格
  • 四、翻转字符串里的单词
  • 五、左旋转字符串
  • 六、实现 strStr()
  • 七、重复的子字符串

  • 字符串中元素只能是字符
  • String s=""是空串,String s=NULL是空白串
  • 除串s本身以外的子串都是真子串
  • 空串是任何串的子串
  • KMP算法:解决字符串匹配问题,前缀表
  • next数组,前缀不包含最后一个,后缀不包含首字母

一、反转字符串

1.题目:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 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"]

2.解题思路

/*** @param {character[]} s* @return {void} Do not return anything, modify s in-place instead.*/
var reverseString = function(s) {//Do not return anything, modify s in-place instead.reverse(s)
};var reverse = function(s) {let l = -1, r = s.length;while(++l < --r) [s[l], s[r]] = [s[r], s[l]];
};
// 运行时间:120ms
// 内存消耗:47.6MB

二、反转字符串(二)

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

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

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

输入: s = "abcdefg", k = 2
输出: "bacdfeg"

2.解题思路

/*** @param {string} s* @param {number} k* @return {string}*/
var reverseStr = function(s, k) {const len = s.length;let resArr = s.split(""); for(let i = 0; i < len; i += 2 * k) {  // 每隔 2k 个字符的前 k 个字符进行反转let l = i - 1, r = i + k > len ? len : i + k;while(++l < --r) [resArr[l], resArr[r]] = [resArr[r], resArr[l]];}return resArr.join("");
};
// 运行时间:80ms
// 内存消耗:43.8MB

三、替换空格

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

示例1

输入:s = "We are happy."
输出:"We%20are%20happy."

2.解题思路

/*** @param {string} s* @return {string}*/var replaceSpace = function(s) {// 字符串转为数组const strArr = Array.from(s);let count = 0;// 计算空格数量for(let i = 0; i < strArr.length; i++) {if (strArr[i] === ' ') {count++;}}let left = strArr.length - 1;let right = strArr.length + count * 2 - 1;while(left >= 0) {if (strArr[left] === ' ') {strArr[right--] = '0';strArr[right--] = '2';strArr[right--] = '%';left--;} else {strArr[right--] = strArr[left--];}}// 数组转字符串return strArr.join('');
};
// 运行时间:60ms
// 内存消耗:41MB

四、翻转字符串里的单词

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

示例

示例 1输入: "the sky is blue"
输出: "blue is sky the"示例 2输入: "  hello world!  "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。示例 3输入: "a good   example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

2.解题思路

/*** @param {string} s* @return {string}*/var reverseWords = function(s) {// 字符串转数组const strArr = Array.from(s);// 移除多余空格removeExtraSpaces(strArr);// 翻转reverse(strArr, 0, strArr.length - 1);let start = 0;for(let i = 0; i <= strArr.length; i++) {if (strArr[i] === ' ' || i === strArr.length) {// 翻转单词reverse(strArr, start, i - 1);start = i + 1;}}return strArr.join('');
};// 删除多余空格
function removeExtraSpaces(strArr) {let slowIndex = 0;let fastIndex = 0;while(fastIndex < strArr.length) {// 移除开始位置和重复的空格if (strArr[fastIndex] === ' ' && (fastIndex === 0 || strArr[fastIndex - 1] === ' ')) {fastIndex++;} else {strArr[slowIndex++] = strArr[fastIndex++];}}// 移除末尾空格strArr.length = strArr[slowIndex - 1] === ' ' ? slowIndex - 1 : slowIndex;
}// 翻转从 start 到 end 的字符
function reverse(strArr, start, end) {let left = start;let right = end;while(left < right) {// 交换[strArr[left], strArr[right]] = [strArr[right], strArr[left]];left++;right--;}
}
// 运行时间:72ms
// 内存消耗:44.4MB   

五、左旋转字符串

1.题目
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

示例


示例 1输入: s = "abcdefg", k = 2
输出: "cdefgab"示例 2输入: s = "lrloseumgh", k = 6
输出: "umghlrlose"限制:
1 <= k < s.length <= 10000

2.解题思路

var reverseLeftWords = function(s, n) {const length = s.length;let i = 0;while (i < length - n) {s = s[length - 1] + s;i++;}return s.slice(0, length);
};
// 运行时间:120ms
// 内存消耗:47MB
// 原字符串上操作
/*** @param {string} s* @param {number} n* @return {string}*/
var reverseLeftWords = function (s, n) {/** Utils */function reverseWords(strArr, start, end) {let temp;while (start < end) {temp = strArr[start];strArr[start] = strArr[end];strArr[end] = temp;start++;end--;}}/** Main code */let strArr = s.split('');let length = strArr.length;reverseWords(strArr, 0, length - 1);reverseWords(strArr, 0, length - n - 1);reverseWords(strArr, length - n, length - 1);return strArr.join('');
};
// 运行时间:80ms
// 内存消耗:43.3MB

六、实现 strStr()

1.题目
实现 strStr() 函数。

给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
示例

示例 1: 输入: haystack = "hello", needle = "ll" 输出: 2示例 2: 输入: haystack = "aaaaa", needle = "bba" 输出: -1说明: 当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。 对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。

2.解题思路

// 前缀表统一减一
/*** @param {string} haystack* @param {string} needle* @return {number}*/
var strStr = function (haystack, needle) {if (needle.length === 0)return 0;const getNext = (needle) => {let next = [];let j = -1;next.push(j);for (let i = 1; i < needle.length; ++i) {while (j >= 0 && needle[i] !== needle[j + 1])j = next[j];if (needle[i] === needle[j + 1])j++;next.push(j);}return next;}let next = getNext(needle);let j = -1;for (let i = 0; i < haystack.length; ++i) {while (j >= 0 && haystack[i] !== needle[j + 1])j = next[j];if (haystack[i] === needle[j + 1])j++;if (j === needle.length - 1)return (i - needle.length + 1);}return -1;
};
#运行时间:56ms
#内存消耗:41.1MB
// 前缀表统一不减一
/*** @param {string} haystack* @param {string} needle* @return {number}*/
var strStr = function (haystack, needle) {if (needle.length === 0)return 0;const getNext = (needle) => {let next = [];let j = 0;next.push(j);for (let i = 1; i < needle.length; ++i) {while (j > 0 && needle[i] !== needle[j])j = next[j - 1];if (needle[i] === needle[j])j++;next.push(j);}return next;}let next = getNext(needle);let j = 0;for (let i = 0; i < haystack.length; ++i) {while (j > 0 && haystack[i] !== needle[j])j = next[j - 1];if (haystack[i] === needle[j])j++;if (j === needle.length)return (i - needle.length + 1);}return -1;
};
#运行时间:72ms
#内存消耗:41MB

七、重复的子字符串

1.题目
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。
示例

示例 1:
输入: "abab"
输出: True
解释: 可由子字符串 "ab" 重复两次构成。示例 2:
输入: "aba"
输出: False示例 3:
输入: "abcabcabcabc"
输出: True
解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。)
/*** @param {string} s* @return {boolean}*/
var repeatedSubstringPattern = function (s) {if (s.length === 0)return false;const getNext = (s) => {let next = [];let j = -1;next.push(j);for (let i = 1; i < s.length; ++i) {while (j >= 0 && s[i] !== s[j + 1])j = next[j];if (s[i] === s[j + 1])j++;next.push(j);}return next;}let next = getNext(s);if (next[next.length - 1] !== -1 && s.length % (s.length - (next[next.length - 1] + 1)) === 0)return true;return false;
};
#运行时间:76ms
#内存消耗:47.3MB
/*** @param {string} s* @return {boolean}*/
var repeatedSubstringPattern = function (s) {if (s.length === 0)return false;const getNext = (s) => {let next = [];let j = 0;next.push(j);for (let i = 1; i < s.length; ++i) {while (j > 0 && s[i] !== s[j])j = next[j - 1];if (s[i] === s[j])j++;next.push(j);}return next;}let next = getNext(s);if (next[next.length - 1] !== 0 && s.length % (s.length - next[next.length - 1]) === 0)return true;return false;
};
#运行时间:72ms
#内存消耗:47.3MB

http://www.tj-hxxt.cn/news/10998.html

相关文章:

  • 什么叫营销型网站建设可以搜任何网站的浏览器
  • 网站的结构网站seo策划方案
  • 下列不属于网站建设规划免费网站优化排名
  • 网站的性能需求mac日本官网入口
  • 网站建设模板 源码 特效学营销app哪个更好
  • 网站设计上海深圳在线制作网站
  • 备案的网站域名百度com打开
  • shopify可以用来做B2B网站吗蚌埠seo外包
  • 用ps做网站主页网络推广运营是做什么
  • 网站建设驻地开发合同google搜索app下载
  • 衡东网站制作关键词优化好
  • 商城网站开发费用一般是多少seo排名快速上升
  • 电脑版商城网站建设同仁seo排名优化培训
  • 网站建设讯美企业推广宣传方式
  • 北风淘淘网站开发吉林seo刷关键词排名优化
  • wordpress设置积分阅读常熟seo关键词优化公司
  • 属于网站建设过程规划搜索引擎营销的内容有哪些
  • 整合营销的特点人员优化方案
  • Asp.net网站开发分析app下载量推广
  • wordpress发布站点百分百营销软件官网
  • 网站做赌博词怎么推广上海关键词优化公司bwyseo
  • 教育与培训网站建设线上销售平台如何推广
  • 淘宝联盟怎么建网站网站优化建设
  • 做网站准备的资料网站建设图片
  • 设计师网站都有哪些站长之家网站模板
  • ruby 做网站百度关键词挖掘查询工具
  • 做网站需要编程?流感用什么药最好
  • 珠海网站建设有限公司搜索图片识别出处百度识图
  • 做游戏ppt下载网站市场推广和销售的区别
  • 中山祥云做的网站怎么样百度百科俄罗斯搜索引擎浏览器官网入口