1.数组中只出现一次的两个数字
题目:
思路:
第一种:indexOf()和lastIndexOf(),只要两个相等,就是只出现一次的数。
第二种:使用obj记录下每个数的次数,占空间
function FindNumsAppearOnce( array ) {
// write code here
let len = array.length
let arr = []
for(let i = 0; i<len; i++ ){
if(array.indexOf(array[i]) === array.lastIndexOf(array[i])) {
arr.push(array[i])
}
}
return arr.sort((a,b) => a-b)
}
function FindNumsAppearOnce( array ) {
// write code here
let len = array.length
let obj = {}
for(let i = 0; i<len; i++) {
if(!obj[array[i]]) {
obj[array[i]] = 1
}else {
obj[array[i]] = obj[array[i]]+1
}
}
let arr = []
for(var k in obj) {
if(obj[k] === 1) {
arr.push(k)
}
}
return arr.sort((a,b) => a-b)
}
2. 和为S的连续正数序列
题目:
思路: 定义两个数组,一个数组用于放连续数组序列,当条件符合时另一个数组存放符合条件的连续数组序列,当前序列的总和如果超过了S,就弹出序列最前的数,如还大于,再接着弹出序列最前的数。
function FindContinuousSequence(sum)
{
// write code here
let arr = [],
res = [],
total = 0
for (let i = 1; i < sum; i++) {
arr.push(i)
total += i
while(total > sum) {
total -= arr[0]
arr.shift()
}
if(total === sum) {
res.push(arr.slice(0))
total -= arr[0]
arr.shift()
}
}
return res
}
3. 和为S的两个数字
题目:
思路: 双指针
- 使用left 表示左边指向的值,使用right 表示右边指向的值。
- (left + right) 与 sum 大小情况 a. (left right)> sum, 则r--, 降低两数之和;
b. (left + right) < sum, 则l ++,增大两数之和;
c. (left + right) == sum ,则返回;
function FindNumbersWithSum(array, sum)
{
// write code here
let left = 0,
right = array.length - 1,
num = 0
while(left < right) {
num = array[left] + array[right]
if(num > sum) {
right--
}else if (num < sum) {
left++
}else {
return [array[left],array[right]]
}
}
return []
}
4. 左旋转字符串
题目:
思路:1.使用字符串substr()方法
2.反转字符串:局部反转+整体反转
function LeftRotateString(str, n)
{
// write code here
if (str === null) return ''
if(str.length < n) {
return str
}
let str1 = str.substr(0,n),
str2 = str.substring(n)
return str2 + str1
}