web前端面试题

1.数据结构和算法

1)反转单词

export default (str) => {
  // 字符串按空格进行分隔,保存数组,数组的元素的先后顺序就是单词的顺序
  let arr = str.split(' ')
  // 对数组进行遍历,然后每个元素进行反转
  let result = arr.map(item => {
    return item.split('').reverse().join('')
  })
  return result.join(' ')
}

2)冒泡排序

web前端面试题_第1张图片

export default arr => {
  // 冒泡排序
  // 为什么 i = arr.lentgh - 1 因为j 0; i--) {
 
    // 下面的for循环其实就是把最大的值一直往下放
    // 1.tmp就是当前所认为最大的值
    // 2.假如tmp比下一个还要大,那么交换
    for (let j = 0; j < i; j++) {
      tmp = arr[j];
      if (tmp > arr[j + 1]) {
        arr[j] = arr[j + 1];
        arr[j + 1] = tmp;
      }
    }
  }
  return arr;
};
 
import sort from '../../code/sort/lesson1-1';
 
test('冒泡排序', () => {
  expect(sort([1, 9, 5, 3, 4])).toEqual([1, 3, 4, 5, 9]);
});

 3)选择排序

web前端面试题_第2张图片

export default arr => {
  // 选择排序
  for (let i = 0, len = arr.length, min; i < len; i++) { // 此处从0开始一个个比较
    min = arr[i] // 最小值的初始值设为当前遍历到的这个值
 
    // 下面整个for循环其实无非是从i的第二个开始遍历
    // 1.如果发现该数比min小,那么min变成该数,该数变成min
    // 2.遍历完成之后,i值就是最小的那个
    // 总结: 进行上面的遍历之后,就可以找到i往后最小的值,这也就是选择排序的中心思想
    for (let j = i + 1; j < len; j++) {
      if (arr[j] < min) {
        let c = min
        min = arr[j]
        arr[j] = c
      }
    }
    arr[i] = min
  }
 
  return arr
}

4)快速排序

export default (arr) => {
  let quickSort = (arr) => {
    let len = arr.length
    if (len < 2) {
      return arr
    } else {
      // 选标尺元素
      let flag = arr[0]
      let left = []
      let right = []
      // 把剩余的元素遍历下,比标尺元素小的放左边,大的放右边
      for (let i = 1, tmp; i < len; i++) {
        tmp = arr[i]
        if (tmp < flag) {
          left.push(tmp)
        } else {
          right.push(tmp)
        }
      }
      // 进行递归操作
      return quickSort(left).concat(flag, quickSort(right))
    }
  }
  return quickSort(arr)
}

5)时间复杂度

web前端面试题_第3张图片

找时间复杂度的技巧

 a.找出算法中的基本语句(算法中执行次数最多的那条语句就是基本语句,通常是最内层循环的循环体)

b.计算基本语句的执行次数的数量级(只要保证基本语句执行次数的函数中的最高次幂正确即可)

举例

a.一个简单语句的时间复杂度为O(1)。int count = 0;

b.100个简单语句的时间复杂度也为O(1)。(100是常数,不是趋于无穷大的n)。int count = 0;

c.一个循环的时间复杂度为O(n).

int n=8,count = 0;

for(inti=1;i<=10n+100;i++){

  count++;

}

d.时间复杂度为的循环语句

int n=8,count=0;

for(int i=1;i<=n;i*=2){

 count++

}

e.时间复杂度为

f

.

web前端面试题_第4张图片

2.Javascript系列

*什么是跨域

跨域是指从一个域名的网页去请求另一个域名的资源。比如:A上的页面获取B上的资源。

概念:只要协议、主机、端口有任何一个不同,都被当作是不同的域。

*哪些办法可以实现跨域

a.JSONP 动态创建

你可能感兴趣的:(web面试题)