一、 查找字符串中的最长公共前缀
// ⽰例: 输⼊: [“flower”,“flow”,“flight”] 输出: “fl”
<script>
var arr = ['flower', 'flow', 'flight']
var result = ''
for (var i = 0; i < arr[0].length; i++) {
for (var j = 1; j < arr.length; j++) {
if (arr[0][i] != arr[j][i]) {
break;
} else if (arr[0][i] == arr[j][i] && j == arr.length - 1) {
result += arr[0][i]
}
}
}
console.log(result)
</script>
二、给定⼀个按照升序排列的整数数组 nums,和⼀个⽬标值 target。找出给定⽬标值在数组中的开始位置和结束位置。 如果数组中不存在⽬标值,返回 [-1, -1]。
<script>
// 给定⼀个按照升序排列的整数数组 nums,和⼀个⽬标值 target。找出给定⽬标值在数组中的开始位置和结束位置。 如果数组中不存在⽬标值,返回 [-1, -1]。
// ⽰例:
// 输⼊: nums = [5, 7, 7, 8, 8, 10], target = 8, 输出:[3, 4] 输⼊: nums = [5, 7, 7, 8, 8, 10], target = 6, 输出:[-1, -1] 思路: 1. 开始位置 indexOf 2. 结束位置: 翻转数组, 求arr.length - (indexOf + 1)
// 法(一)
// function fn(num) {
// var nums = [5, 7, 7, 8, 8, 10]
// var arr = []
// for (var i = 0; i < nums.length; i++) {
// if(num == nums[i]){
// arr.push(i)
// }
// }
// var arr2 = []
// arr2.push(arr[0])
// arr2.push(arr[arr.length-1])
// console.log(arr2,'arr2-----------')
// }
// fn(8)
// 法(二)
function fn(num) {
var nums = [5, 7, 7, 8, 8, 10]
var arr = []
var first = nums.indexOf(num)
arr.push(first)
var newnums = nums.reverse()
console.log(newnums)
var end = newnums.indexOf(num)
arr.push(newnums.length-end-1)
console.log(arr)
}
fn(8)
</script>
三、 回⽂ 是指把相同的词汇或句⼦, 在下⽂中调换位置或颠倒过来, 产⽣⾸尾回环的情趣, 叫做回⽂,也叫回环。
<script>
// 思路: 将字符串转换成数组, 使用reverse方法对数组进行颠倒,判断颠倒后的两个字符串是否相同
function fn(str){
var arr = str.split('')
var arr2 = arr.reverse()
if(str == arr2.join('')){
console.log(str,'是回文数')
}else{
console.log(str,'不是回文数')
}
}
fn('159951')
</script>
四、去掉⼀组整型数组重复的值 ⽐如输⼊: [1,13,1,24,11,11,14,1,2] 输出: [1,13,24,11,14,2] 需要去掉重复的11 和 1 这两个元素。
<script>
// 示例:去掉⼀组整型数组重复的值 ⽐如输⼊: [1,13,1,24,11,11,14,1,2] 输出: [1,13,24,11,14,2] 需要去掉重复的11 和 1 这两个元素。
// 法一
// function fn(arr) {
// var newarr = []
// for (var i = 0; i < arr.length - 1;) {
// for (var j = i + 1; j < arr.length;) {
// if (arr[i] == arr[j] && j != (arr.length - 1)) {
// arr.splice(j, 1)
// } else if (arr[i] == arr[j] && j == (arr.length - 1)) {
// arr.splice(j, 1)
// i++;
// break;
// } else if (arr[i] != arr[j] && j != (arr.length - 1)) {
// j++;
// } else if (arr[i] != arr[j] && j == (arr.length - 1)) {
// i++;
// break;
// }
// }
// }
// console.log(arr)
// }
// var arr = [1, 13, 1, 24, 11, 11, 14, 1, 2, 8, 13,1]
// fn(arr)
// 法二
// function fn(arr) {
// var arr2 = new Set(arr)
// arr = [...arr2]
// console.log(arr,'arr-----')
// console.log([...arr])
// }
// var arr = [1, 13, 1, 24, 11, 11, 14, 1, 2, 8, 13,1]
// fn(arr)
// 法三
function fn(arr) {
let obj = {
}
for (var i = 0; i < arr.length;i++) {
obj[arr[i]] = arr[i]
}
console.log(Object.values(obj), 'obj------------')
}
var arr = [1, 13, 1, 24, 11, 11, 14, 1, 2, 8, 13, 1]
fn(arr)
</script>
五、统计⼀个字符串出现最多的字母
<script>
// 统计⼀个字符串出现最多的字母
function fn(str){
var arr = str.split('')
let obj = {
}
for(var i=0;i<arr.length;i++){
if(arr[i] in obj){
obj[arr[i]]++
}else{
obj[arr[i]] = 1
}
}
console.log(obj,'obj---------')
let arr2 = []
for(key in obj){
arr2.push(obj[key])
}
//排序(由大到小)
var temp
for(var i=0;i<arr2.length;i++){
for(var j=i+1;j<arr2.length;j++){
if(arr2[j]>=arr2[i]){
temp = arr2[i]
arr2[i] = arr2[j]
arr2[j] = temp
}
}
}
console.log(arr2)
console.log(arr2[0])//出现最多的次数
//去obj查找key
let str2 = ''
for(key in obj){
if(obj[key] == arr2[0]){
str2 = key
}
}
console.log(str2)//出现次数最多的字符
}
var str = 'helloooolllworldee'
fn(str)
</script>
六、不借助临时变量,进⾏两个整数的交换
<script>
var a = 18
var b = 11
b = b - a //差 7
a = a+b //此时的大数 = 小数+差
b = a - b //此时的小数 = 大数-差
console.log(a)
console.log(b)
</script>
七、给定一个数字,获取斐波那契数列
function fn(n) {
let arr = []
let i = 0
while (i < n) {
if (i <= 1) {
arr.push(i)
} else {
arr.push(arr[i - 1] + arr[i - 2])
}
i++
}
return arr
}
fn(20)
八、计算出下列正数组的最⼤差值⽐如: 输⼊ [10,5,11,7,8,9] 输出 6
//思路:获取数组最大值、最小值,他们的差值就是最大差值
function fn(arr) {
for (var i = 0; i < arr.length; i++) {
for (var j = i + 1; j < arr.length; j++) {
let temp
if (arr[i] >= arr[j]) {
temp = arr[j]
arr[j] = arr[i]
arr[i] = temp
}
}
}
console.log(arr)//升序数组
//最大值-最小值
var value = arr[arr.length-1]-arr[0]
console.log(value)
}
let arr = [10, 5, 11, 7, 8, 9]
fn(arr)
九、关于随机数的三个小题目
①.随机生成指定长度的字符串
②.获取指定范围内的随机数
③.随机获取数组中的元素
<script>
// 一、随机⽣成指定长度的字符串
// function fn(number){
// var arr = []
// for(var i=0;i<number;i++){
// console.log(Math.random().toString(36).slice(-number))
// }
// }
// fn(8)
// 二、获取指定范围内的随机数
// function fn2(number1,number2){
// var sub = number2-number1+1
// var number = Math.floor(Math.random()*sub + number1);
// console.log(number)
// }
// fn2(2,5)
// 三、随机获取数组中的元素
var arr = ['s','j','h','e','l','r','e','l']
var temp = arr.length
console.log(arr[Math.floor(Math.random()*temp)])
</script>
十、打乱数字数组的顺序
<script>
// 法一
// function fn(arr) {
// let obj = {}
// let num = arr.length
// for(var i=0;i<arr.length;i++){
// let randomnum = Math.floor(Math.random()*num)//0-12之间的随机数
// let temp
// temp = arr[randomnum]
// arr[randomnum] = arr[i]
// arr[i] = temp
// }
// console.log(arr)
// }
//法二
function fn(arr) {
var len = arr.length;
var arr2 = new Array();
for (var i = len; i > 0; i--) {
var rand = Math.floor(Math.random() * i);
arr2.push(arr[rand]);
arr.splice(rand, 1);
}
return arr2;
}
var arr = [1, 2, 3, 4, 5, 6, 7, 'a', 'dsfs', 8, 9, 'v'];
fn(arr)
</script>
十一、对象转换为数组
<script>
// 对象转换为数组
// 法一
function fn(obj){
var arr = []
for(key in obj){
let obj2={
key:obj[key]
}
arr.push(obj2)
}
console.log(arr)
}
let obj = {
name: 'zs',
age: 18,
sex: '男'
}
fn(obj)
</script>
十二、验证是否为数组
<script>
function fn(arr){
console.log(arr instanceof(Array))
console.log(Object.prototype.toString.call(arr) === '[object Array]')
}
let arr = [1,2,3,4,5]
fn(arr)
</script>
十三、保留指定⼩数位
<script>
var num =3.8899;
num = num.toFixed(2); // 4.3457 第四位⼩数位以四舍五⼊计算
console.log(num)
</script>
十四、找出数组中出现次数最多的元素,并给出其出现过的位置
<script>
function fn(arr) {
let obj = {
}
for (var i = 0; i < arr.length; i++) {
if (arr[i] in obj) {
obj[arr[i]]++
} else {
obj[arr[i]] = 1
}
}
console.log(obj, 'obj------------')
let max = 0
let newarr = [] //包含所有出现次数最多的数
for (key in obj) {
console.log(obj[key], 'key-----------')
if (obj[key] > max) {
max = obj[key]
console.log(max, 'max--------------')
newarr = [key]
} else if (obj[key] == max) {
newarr.push(key)
}
}
console.log(newarr, 'newarr----------')
let maxarrs = []//以key,value的形式,元素为key,位置为value形成一个数组
for (var i = 0; i < newarr.length; i++) {
let obj2 = {
}
obj2[newarr[i]] = []
for (var j = 0; j < arr.length; j++) {
if (newarr[i] == arr[j]) {
console.log(newarr[i] + '出现的位置是:' + j)
obj2[newarr[i]].push(j)
}
}
maxarrs.push(obj2)
}
console.log(maxarrs,'maxarrs------------')
maxarrs.map((item) => {
for (key in item) {
console.log(key + '出现的位置是:' + item[key].join(','))
}
})
}
let arr = [1, 5, 8, 5, 46, 4, 9, 8, 1, 4]
fn(arr)
</script>
十五、给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
<script>
// 输入: nums = [1, 3, 5, 6], target = 3
// 输出: 1
function fn(arr,num){
console.log(arr,'arr-----')
for(var i=0;i<arr.length;i++){
if(arr[i-1]<num && arr[i]>num){
arr.splice(i,0,num)
}else if(arr[i] == num){
console.log(i,'索引为:',i)
}
}
console.log('当前数组为:',arr)
}
let arr = [1,3,5,6,10]
let num = 8
fn(arr,num)
</script>
十六、给定一个任意嵌套结构的对象如下,使用你熟悉的算法,将对象的属性按照层级输出到一个数组中
// 示例:obj = {
// a: {
// b: {
// c: {
// d: 1
// }
// }
// },
// e: 2,
// f: {
// g: 3
// }
// }
// 输出:result = [[a,e,f],[b,g],[c],[d]]
function fn(obj, arr) {
console.log('进入fn方法------')
let arritem = []
Object.keys(obj).forEach((item) => {
arritem.push(item)
if (arritem.length == Object.keys(obj).length) { //把所有的父亲加入了数组
arr.push(arritem)
console.log(arr, 'arr-----')
let newobj = {}
for (var i = 0; i < arritem.length; i++) {
console.log(obj, 'obj----')
if (Object.prototype.toString.call(obj[arritem[i]]) == '[object Object]') {
console.log(obj[arritem[i]], '28------------')
newobj[Object.keys(obj[arritem[i]])[0]] = Object.values(obj[arritem[i]])[0]
}
console.log(newobj, 'newobj-----')
if (i == arritem.length - 1) {
console.log(newobj)
Object.keys(newobj).forEach((item, index) => {
console.log(newobj, '------', Object.keys(newobj).length)
if (index == Object.keys(newobj).length - 1) {
fn(newobj, arr)
}
})
}
}
}
})
return arr
}
let arr = []
let obj = {
a: {
b: {
c: {
d: 1
}
}
},
e: 2,
f: {
g: 3
}
}
console.log(fn(obj, arr))
十七、假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。求当A={a, b, …, n}, B={0, 1, 2, …, n}时的笛卡尔积.
<script>
function fn(arr) {
if (arr.length < 2) return arr[0] || [];
let res = []
res = arr.reduce(function (acc, cur) {
console.log(acc, '--------', cur)
res = []
acc.forEach(c => {
cur.forEach(s => {
let t = [].concat(Array.isArray(c) ? c : [c]);
t.push(s)
res.push(t)
})
})
return res
});
console.log(res)
}
let A = [
[{
a: 1,
b: 2
}, 'c'],
[1, 2, 3],
[7, 8, 9]
]
console.log(fn(A))
</script>
十八、有一个数组arr = [a1d1, a2, a3, b1, b2, b3, c1, c2, c3…], 通过算法将数组进行拆分, 转化为如下格式的数组a1, b1, c1], [a2, b2, c2], [a3, b3, c3]并实现通用公式.
<script>
function fn(arr) {
let result = []
let obj = {
}
arr.forEach(item => {
let i = /\d*$/.exec(item)[0] //全局搜素item中的数字
// console.log(/\d+/.exec(item))//返回第一个符合条件的值
// console.log(item.replace(/[^0-9]/ig, ''))//返回所有的数字
if (i in obj) {
obj[i].push(item)
} else {
obj[i] = [item]
}
})
for (key in obj) {
result.push(obj[key])
}
console.log(result, 'result----------')
}
let arr = ['a158', 'a2', 'a3', 'b1', 'b2', 'b3', 'c1', 'c2', 'c3']
fn(arr)
</script>
十九、输入一个正数N, 输出所有和为N的连续正数序列. 例如输入15, 结果: [[1, 2, 3, 4, 5], [4, 5, 6], [7, 8]]
<script>
function fn(value) {
let arrs = []
var mid = parseInt(value/2)
for (var i = 0; i <= mid;) {
var sum = 0
let arr = []
for (var j = i + 1; j <= mid+1;) {
console.log(j,'j----------')
arr.push(j)
sum += j
if(j==mid+1){
//若j已经达到了mid+1了,则结束循环
console.log('结束了---')
i=mid+1
break;
}else if (sum == value) {
//若累加之和等于value了,则退出本次循环,继续执行外层循环
i++;
arrs.push(arr)
break;
}else if(sum<value && j<mid+1){
//若累加之和小于value并且j还未自增到mid/2(因为考虑到复杂度以及性能,j最大就是mid+1)
j++
}else if(sum>value){
//若累加之和大于value了,那么退出本次循环,继续执行外部循环
i++;
break;
}
}
}
console.log(arrs,'arrs------------')
}
fn(15)
</script>