(所有题目及答案均出自LeetCode)
题目一
问:实现一个算法,确定一个字符串 s 的所有字符是否全都不同。
答:
1. 方法一:
var isUnique = function(astr) {
let bool = true;
for(let i=0;i<astr.length;++i){
let a = astr.substr(i,1);
// substr() 方法可在字符串中抽取从 start 下标开始的指定数目的字符。
if(astr.indexOf(a,i+1)!=-1){ //值为-1意味着没有匹配到相同的a
// 抽取第i个元素a,从第i+1个元素开始检索后面的字符串中是否还存在a,若存在则:
bool = false;
return bool;
}
}
return bool;
};
2. 方法二:
var isUnique = function(astr) {
// ES6语法
let set = new Set(astr.split(''));
return set.size==astr.length;
};
补充:indexOf()
(1)indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。
(2)语法:stringObject.indexOf(searchvalue,fromindex) 第一个必需,第二个非必需
(3)例:
<script type="text/javascript">
var str="Hello world!"
document.write(str.indexOf("Hello") + "<br />")
document.write(str.indexOf("World") + "<br />")
document.write(str.indexOf("world"))
</script>
// 输出
0
-1
6
题目二
问:给定两个字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。
答:
解题思路:
一个字符串重排列之后和另外一个一致,可以满足以下条件:两个包含的字符数目一致;字符一一可以对应。那就是说 s1里面有一个字符串s2内没有,那么就不可以。
(1)我们先判断两个字符串是否大小一致,不一致直接返回;
(2)然后我们创建数组,对s1数组进行循环,并且每次从s2数组里面找看是否存在对应的值
(3)存在的话,返回true,继续循环(但是注意,每次找到对应相同的值,要从s2里面利用findIndex找到下标,删除对应的值,保证不会重复)
(4)不存在,结束循环,返回false
var CheckPermutation = function(s1, s2) {
const s1Arr = s1.split('')
const s2Arr = s2.split('')
if (s1.length!=s2.length) return false
let flag = true
for(let i = 0; i< s1Arr.length; i++){
if(s2Arr.join('').indexOf(s1Arr[i])==-1){
return false
break;
}else{
delete s2Arr[s2Arr.findIndex(item=>item==s1Arr[i])]
}
}
return flag
};
补充:
- split()
(1)split() 方法用于把一个字符串分割成字符串数组。如果把空字符串 ("") 用作 separator,那么 stringObject 中的每个字符之间都会被分割。
(2)例:
<script type="text/javascript">
var str="How are you doing today?"
document.write(str.split(" ") + "<br />")
document.write(str.split("") + "<br />")
document.write(str.split(" ",3))
</script>
// 输出如下
How,are,you,doing,today?
H,o,w, ,a,r,e, ,y,o,u, ,d,o,i,n,g, ,t,o,d,a,y,?
How,are,you
- join()
(1)join() 方法用于把数组中的所有元素放入一个字符串。
(2)语法:arrayObject.join(separator) 参数非必需,如果省略该参数,则使用逗号作为分隔符。
(3)例:
<script type="text/javascript">
var arr = new Array(3)
arr[0] = "George"
arr[1] = "John"
arr[2] = "Thomas"
document.write(arr.join())
</script>
// 输出
George,John,Thomas
题目三
问:URL化。编写一种方法,将字符串中的空格全部替换为%20。假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的“真实”长度。
答:
方法一:正则表达式
var replaceSpaces = function(S, length) {
return S.substr(0, length).replace(/\s/g, '%20')
};
方法二:字符串替换
解题思路:利用substring限制长度,然后通过split分隔空格,然后再用join把%20加进去,造成一个替换的感觉。
var replaceSpaces = function(S, length) {
return S.substr(0, length).split(' ').join('%20')
};
题目四
问:给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。回文串不一定是字典当中的单词。
答:
遍历
var canPermutePalindrome = function(s) {
let obj = {};
for(let i=0; i<s.length; i++){
let char = s[i];
if(obj[char])
delete obj[char]
else
obj[char] = 1;
}
return Object.keys(obj).length <= 1;
};
题目五
问:字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。
答:
解题思路:
首先判断两个字符串是否相同,相同返回true;
不同则分为两种情况:
1.长度相同,判断两个字符串对位是否相同,记录不同次数,次数小于等于1则返回true;
2.长度差一位,先用循环找出长字符串和短字符串开始出现不同的位置,在长字符串中截取不包括该位置的后面部分与短字符串包括该位置的后面部分进行比较,相同返回true。
var oneEditAway = function(first, second) {
if(first===second){return true}
let a=first.length;
let b=second.length;
if(a===b){
let c=0;
for(let i=0;i<a;i++){
if(first[i]!==second[i]){
c++
}
}
return c<=1
}else if(a-b===1||-1){
let s1=a>b?first:second;
let s2=a<b?first:second;
for(let i=0;i<s1.length;i++){
if(s1[i]!==s2[i]){
return s1.substring(i+1)===s2.substring(i)
}
}
}
return false
};
补充:
substring()
(1)substring() 方法返回字符串的子字符串。
(2)语法:stringObject.substring(start,stop),返回一个新的字符串,该字符串值包含 stringObject 的一个子字符串,其内容是从 start 处到 stop-1 处的所有字符,其长度为 stop 减 start。substring() 方法返回的子串包括 start 处的字符,但不包括 stop 处的字符。
(3)示例:
<script type="text/javascript">
var str="Hello world!"
document.write(str.substring(3))
</script>
// 输出
lo world!