前端面试算法题
一、不借助临时变量,进行两个整数的交换
//方法一 ES6
var a = 1, b = 2;
[a,b] = [b,a];
console.log(a,b)
// 方法二 异或运算,同为0或者同为1都为0,10为1
var c = 3, d = 4;
c = c ^ d;
d = c ^ d;
c = c ^ d;
console.log(c,d)
二、字符串查找:请使用最基本的遍历来实现判断字符串 a 是否被包含在字符串 b 中,并返回第一次出现的位置(找不到返回 -1)。
例子:
a='34';b='1234567'; // 返回 2
a='35';b='1234567'; // 返回 -1
a='355';b='12354355'; // 返回 5
isContain(a,b);
答案:
function isContain(a, b) {
for (let i in b) {
if (a[0] === b[i]) {
let tmp = true;
for (let j in a) {
if (a[j] !== b[~~i + ~~j]) {
tmp = false;
}
}
if (tmp) {
return i;
}
}
}
return -1;
}
三、统计一个字符串出现最多的字母:给出一段英文连续的英文字符窜,找出重复出现次数最多的字母。
例子:
输入 : afjghdfraaaasdenas
输出 : a
答案:
function findMaxDuplicateChar(str) {
if(str.length == 1) {
return str;
}
let charObj = {};
for(let i=0;i<str.length;i++) {
if(!charObj[str.charAt(i)]) {
charObj[str.charAt(i)] = 1;
}else{
charObj[str.charAt(i)] += 1;
}
}
let maxChar = '',
maxValue = 1;
for(var k in charObj) {
if(charObj[k] >= maxValue) {
maxChar = k;
maxValue = charObj[k];
}
}
return maxChar;
}
module.exports = findMaxDuplicateChar;
四、找出下列正数组的最大差值
例子:
输入 [10,5,11,7,8,9]
输出 6
答案:
function getMaxProfit(arr) {
var minPrice = arr[0];
var maxProfit = 0;
for (var i = 0; i < arr.length; i++) {
var currentPrice = arr[i];
minPrice = Math.min(minPrice, currentPrice);
var potentialProfit = currentPrice - minPrice;
maxProfit = Math.max(maxProfit, potentialProfit);
}
return maxProfit;
}
五、斐波那契数列:1、1、2、3、5、8、13、21。输入n,输出数列中第n位数的值。
方案一:
function fn(n){
var num1 = 1, num2= 1, num3 = 0;
for(var i=0;i<n-2;i++){
num3 = num1+num2;
num1 = num2;
num2 = num3;
}
return num3;
}
console.log(fn(7)) //13
方案二:
function fn(n){
if(n<=2){
return 1;
}
return fn(n-1)+fn(n-2);
}
console.log(fn(7)) //13
六、用js实现二分查找:二分查找的前提是有序数组
例子:
将要查找的值每次与中间值比较,大于中间值,则在右边进行相同的查找,小于中间值则在左边进行比较查找,找到返回索引值,没找到返回-1。
1.非递归:
function binarySearch(target,arr){
var start = 0;
var end = arr.length-1;
while(start <= end){
var mid = parseInt((start+end)/2);
if(target == arr[mid]){
return mid
}else if(target > arr[mid]){
start = mid + 1;
}else if(target < arr[mid]){
end = mid - 1;
}else{
return -1;
}
}
}
var arr = [1,2,4,6,8,9,11,34,67];
console.log(binarySearch(11,arr));
2.递归:
function binarySearch(arr,target,start,end){
var start = start || 0;
var end = end || arr.length-1;
var mid = parseInt((start+end)/2);
if(target == arr[mid]){
return mid
}else if(target > arr[mid]){
start = mid + 1;
return binarySearch(arr,target,start,end);
}else if(target < arr[mid]){
end = mid - 1;
return binarySearch(arr,target,start,end);
}else{
return -1;
}
}
var arr = [1,2,4,6,8,9,11,34,67];
console.log(binarySearch(arr,11));
七、数组去重
方案一:
function fn(arr){
var obj = {};
var newArr = [];
for(var i=0;i<arr.length;i++){
if(!obj[arr[i]]){
obj[arr[i]] = 1;
newArr.push(arr[i]);
}
}
return newArr;
}
var arr = [2,4,7,3,5,2,8,7];
console.log(fn(arr));
方案二:
var arr = [2,4,7,3,5,2,8,7];
var setArr = new Set(arr);
var newArr = Array.from(setArr);
console.log(newArr);
方案三:
var arr =[1,2,2,4,5,4,11,6];
function fn(arr){
var a=arr;
for(var i=0;i<a.length;i++){
for(var j=a.length-1;j>i;j--){
if(a[i]==a[j]){
a.splice(j,1);
}
}
}
return a;
}
var s=fn(arr);
console.log(s);
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· “你见过凌晨四点的洛杉矶吗?”--《我们为什么要睡觉》
· 提示词工程师自白:我如何用一个技巧解放自己的生产力
· C# 从零开始使用Layui.Wpf库开发WPF客户端
· C#/.NET/.NET Core技术前沿周刊 | 第 31 期(2025年3.17-3.23)
· 如何不购买域名在云服务器上搭建HTTPS服务
2017-03-03 你所不知的 CSS ::before 和 ::after 伪元素用法