前端基础练习题目

//判断是否为回文字符串


function reverse(arr) {
     let left = 0;
    let right = arr.length-1
    while(left < right){
        if(arr[left] != arr[right]){
            return false
        }
        left ++;
        right --;
    }return true
}
var arr = "absba"
var x = reverse(arr)
console.log(x)
第一个只出现一次的字符

function only(str) {
  const arr1 = [];
  for (let i = 0; i < str.length; i++) {
    if (arr1.indexOf(str[i]) === -1) {
      arr1.push(str[i]);
    } else {
      const index = arr1.indexOf(str[i]);
      if (index !== -1) {
        arr1.splice(index, 1);
      }
    }
  }
  return arr1[0];
}

const str = "google"; 
console.log(only(str));
最长公共前缀

function longestCommonPrefix(strs) {
  if (strs.length === 0) {
    return "";
  }

  // 将数组按照字符顺序排序
  strs.sort();
    //console.log(strs.sort());
    //['abc', 'abc', 'abca', 'abcda', 'abcdc']

  // 取出第一个和最后一个字符串
  const firstStr = strs[0];
  const lastStr = strs[strs.length - 1];

  // 比较第一个和最后一个字符串的字符
  let prefix = "";
  for (let i = 0; i < firstStr.length; i++) {
    if (firstStr[i] === lastStr[i]) {
      prefix += firstStr[i];
    } else {
      break;
    }
  }

  return prefix;
}

const input = ["abcda", "abc", "abca", "abc", "abcdc"];
const result = longestCommonPrefix(input);
console.log(result); // 输出 "abc"
//反转字符串


function reverse(str) {
    let i = 0;
    let j = str.split('').length-1
    const arr = [];
    while (i<str.length) {
       arr[i] = str[j]; 
       i++;
       j--;
    }
    return arr.join('');
}
const str = "abcd"
console.log(reverse(str))
//最长回文字符串


function getLongestPalindrome(A,n) {
	 let dp = []  
	 let max = 0
	//js初始化二维数组
	 for(let i =0;i<n;++i){
		 dp[i] = []
		 for(let j=0;j<n;++j) {
			 dp[i][j] = 0
		 }
	 }
	 for(let i =n-1;i>=0;--i) {
		 for(let j =i;j<n;++j) {
			 if(A[i]==A[j]) {
				 if(j-i<2) {
				 //对于单个字符 如a
				//或者两个字符 如 aa 的情况
					 dp[i][j] = j-i+1
				 }else{
				 //dp[i+1][j-1]==(j-i-1)
				 //判断的是字符A[i+1:j-1]是否是一个回文字符串,如果是回文字符串那dp[i+1][j-1]的值应该和字符串的长度相等
					 dp[i][j] = dp[i+1][j-1]==(j-i-1)? dp[i+1][j-1]+2:dp[i+1][j-1] 
				 } 
			 }else{
				 dp[i][j] = dp[i+1][j-1] 
			 }
			 max = Math.max(max,dp[i][j])
		 }
	 }
	return max
}
//大数加法
//描述 以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。
//(字符串长度不大于100000,保证字符串仅由’0’~'9’这10种字符组成)


function add(str1,str2) {
    const l1 = Number.parseInt(str1)
    const l2 = Number.parseInt(str2)
    const sum = (l1 + l2).toString()
    return sum
}
const str1 = "1"
const str2 = "22"
console.log(add(str1,str2))
//kmp算法
//描述 给你一个文本串S,一个非空模板串T,问S在T中出现了多少次


function buildPartialMatchTable(pattern) {
  const table = new Array(pattern.length).fill(0);
  let length = 0;
  let i = 1;

  while (i < pattern.length) {
    if (pattern[i] === pattern[length]) {
      length++;
      table[i] = length;
      i++;
    } else {
      if (length !== 0) {
        length = table[length - 1];
      } else {
        table[i] = 0;
        i++;
      }
    }
  }

  return table;
}

function kmpSearch(text, pattern) {
  const m = pattern.length;
  const n = text.length;
  const table = buildPartialMatchTable(pattern);

  let count = 0;
  let i = 0;
  let j = 0;

  while (i < n) {
    if (pattern[j] === text[i]) {
      i++;
      j++;
    }

    if (j === m) {
      count++;
      j = table[j - 1];
    } else if (i < n && pattern[j] !== text[i]) {
      if (j !== 0) {
        j = table[j - 1];
      } else {
        i++;
      }
    }
  }

  return count;
}

const str1 = "ababab";
const str2 = "abababab";
console.log(kmpSearch(str2, str1)); // 输出 2,"ababab" 在 "abababab" 中出现了两次
//最长重复子串
//定义重复字符串是由两个相同的字符串首尾拼接而成,例如 “abcabc"便是长度为6的一个重复字符串, 而"abcba”则不存在重复字符串。

//给定一个字符串,请返回其最长重复子串的长度。

//若不存在任何重复字符子串,则返回 0 。

//示例1

//输入: “ababc”

//返回值: 4


function repeat(str){
    if(str.lenght<=1 && str == null){
        return 0
    }
    let maxLen = Number.parseInt(str.length/2) 
	while(maxLen>0) {
		for(let  i = 0;i<=str.length-maxLen*2;++i) {
			if(str.slice(i,i+maxLen)===str.slice(i+maxLen,i+maxLen*2)) {
				return maxLen*2 
			}
		}
		maxLen--
	} 
	return 0 
    
}
const str = "ababc"
console.log(repeat(str))
//两数之和
//题目: 给定一个数组 nums 和一个目标值 target,在该数组中找出和为目标值的两个数
//输入: nums: [8, 2, 6, 5, 4, 1, 3] ; target:7
//输出: [2, 5]


function add(arr,target) {
    let map= {}
    for(let i = 0 ;i < arr.length; i++){
      if (map[target - arr[i]] !== undefined) {
        return [target - arr[i], arr[i]];
      } else {
        // 条件不成立,将该值存起来
        map[arr[i]] = i;
      }
    }
}
const arr = [8, 2, 6, 5, 4, 1, 3] 
const target = 7
console.log(add(arr,target))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值