前端基础知识与常见面试题(七)

实现删除字符串中出现次数最少的字符,若出现次数最少的字符有多个,则把出现次数最少的字符都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。

数据范围:输入的字符串长度满足 1 \le n \le 20 \ 1≤n≤20  ,保证输入的字符串中仅出现小写字母
法一:
let str=readline().split('')
let c={}
let og=[]
 
    for(var i=0;i<str.length;i++){
      if(c[str[i]]){
         c[str[i]]++
      } else{
           c[str[i]]=1
      }      
    }
  
  for(var k in c){
     og.push(c[k])
  }
let min=og.sort(function(a,b){return a-b})[0]
    for(var k in c){
        if(c[k]==min){
            while(str.indexOf(k)!==-1){
                str.splice(str.indexOf(k),1)
               
            }
        }
    }
 console.log(str.join(''))
法二:
let str = readline().split('');
let obj = {};
        str.map((item) => {
            if (!obj[item]) {
                obj[item] = 1;
            } else {
                obj[item] +=1;
            }
        });
        // 将obj中所有字母的次数取出来,算出最小次数
        const min = Object.values(obj).sort((a,b)=>a-b)[0];
        // 遍历obj找到字符,在str中删除
        for(let key in obj){
            if(obj[key]==min){
                while(str.includes(key)){
                    str.splice(str.indexOf(key),1);
                }
            }
        }
        console.log(str.join(''));
————————————————————————————————
描述
原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成
一个长整数。
举例:一个ip地址为10.0.3.193
每段数字             相对应的二进制数
10                   00001010
0                    00000000
3                    00000011
193                  11000001

组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。

数据范围:保证输入的是合法的 IP 序列

输入描述:
输入 
1 输入IP地址
2 输入10进制型的IP地址

输出描述:
输出
1 输出转换成10进制的IP地址
2 输出转换后的IP地址

示例1
输入:
10.0.3.193
167969729
复制
输出:
167773121
10.3.3.193
解:let str=readline().split('.')
let sum=""
for(var i=0;i<str.length;i++){
 let n=Number(str[i]).toString(2)
 while(n.length<8){
     n='0'+`${n}`
 }
   sum+=n
}
console.log(parseInt(sum,2))
let str0=readline()
let n=Number(str0).toString(2).split('').reverse()
let arr=[]
for(var i=0;i<n.length;i+=8){
  let og= n.slice(i,i+8).reverse().join("")
  arr.push(og)
}
let res=arr.reverse()
let end=''
for(var i=0;i<res.length;i++){
  let hh= parseInt(res[i],2) 
  if(i==res.length-1){end+=hh}else{end+=`${hh}.`}
  
}

console.log(end)
————————————————————
描述
输入整型数组和排序标识,对其元素按照升序或降序进行排序

数据范围: 1 \le n \le 1000 \ 1≤n≤1000  ,元素大小满足 0 \le val \le 100000 \ 0≤val≤100000 
输入描述:
第一行输入数组元素个数
第二行输入待排序的数组,每个数用空格隔开
第三行输入一个整数0或1。0代表升序排序,1代表降序排序

输出描述:
输出排好序的数字

示例1
输入:
8
1 2 4 9 3 55 64 25
0
复制
输出:
1 2 3 4 9 25 55 64
复制
示例2
输入:
5
1 2 3 4 5
1
复制
输出:
5 4 3 2 1
解:let str1=readline()

let str2=readline().split(' ')
 
let str3=readline()
if(str3==0){
    console.log(str2.sort((a,b)=>a-b).join(' '))
}else{
    console.log(str2.sort((a,b)=>b-a).join(' '))
}
——————————————————————————
描述
数据表记录包含表索引index和数值value(int范围的正整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照index值升序进行输出。


提示:
0 <= index <= 11111111
1 <= value <= 100000

输入描述:
先输入键值对的个数n(1 <= n <= 500)
接下来n行每行输入成对的index和value值,以空格隔开

输出描述:
输出合并后的键值对(多行)

示例1
输入:
4
0 1
0 2
1 2
3 4
复制
输出:
0 3
1 2
3 4
复制
示例2
输入:
3
0 1
0 2
8 9
复制
输出:
0 3
8 9
解:let str=readline()
let num=""
let obj={}
while(num=readline()){
    let n=num.split(' ')
    if(obj[n[0]]){
        obj[n[0]]+=n[1]*1
    }else{
        obj[n[0]]=n[1]*1
    }
}
for(var k in obj){
    console.log(k,obj[k])
}
——————————————————————
描述
给定 n 个字符串,请对 n 个字符串按照字典序排列。

数据范围: 1 \le n \le 1000 \ 1≤n≤1000  ,字符串长度满足 1 \le len \le 100 \ 1≤len≤100 
输入描述:
输入第一行为一个正整数n(1≤n≤1000),下面n行为n个字符串(字符串长度≤100),字符串中只含有大小写字母。
输出描述:
数据输出n行,输出结果为按照字典序排列的字符串。
示例1
输入:
9
cap
to
cat
card
two
too
up
boat
boot
复制
输出:
boat
boot
cap
card
cat
to
too
two
up
解:let num = readline()
let arr = []
while(line = readline()) {
    arr.push(line)
}
arr.sort()
for(let i=0;i<arr.length;i++) {
    console.log(arr[i])
}
————————————————————————
描述
给出一组区间,请合并所有重叠的区间。
请保证合并后的区间按区间起点升序排列。

数据范围:区间组数 0 \le n \le 2 \times 10^50≤n≤2×10 
5
 ,区间内 的值都满足 0 \le val \le 2 \times 10^50≤val≤2×10 
5
 
要求:空间复杂度 O(n)O(n),时间复杂度 O(nlogn)O(nlogn)
进阶:空间复杂度 O(val)O(val),时间复杂度O(val)O(val)
示例1
输入:
[[10,30],[20,60],[80,100],[150,180]]
复制
返回值:
[[10,60],[80,100],[150,180]]
复制
示例2
输入:
[[0,10],[10,20]]
复制
返回值:
[[0,20]]
解: * function Interval(a, b){
 *   this.start = a || 0;
 *   this.end = b || 0;
 * }
 */

/**
 * 
 * @param intervals Interval类一维数组 
 * @return Interval类一维数组
 */
function merge( intervals ) {
    // write code here
    let len = intervals.length;
    let arr = [];
    let j = 0;
    intervals.sort(function(a,b){return a.start - b.start});
    while(j < len){
        while(j < len - 1 && intervals[j].end >= intervals[j + 1].start){
            j++;
            intervals[j].start = intervals[j - 1].start;
            if(intervals[j].end < intervals[j - 1].end){
                intervals[j].end = intervals[j - 1].end;
            }
        }
        arr.push(intervals[j]);
        j++;
    }
    return arr;
}
module.exports = {
    merge : merge
};
——————————————————
描述
给定一些同学的信息(名字,成绩)序列,请你将他们的信息按照成绩从高到低或从低到高的排列,相同成绩

都按先录入排列在前的规则处理。

例示:
jack      70
peter     96
Tom       70
smith     67

从高到低  成绩 
peter     96 
jack      70 
Tom       70 
smith     67

从低到高

smith     67

jack      70

Tom       70 
peter     96

注:0代表从高到低,1代表从低到高

数据范围:人数:1\le n \le 200\ 1≤n≤200 
进阶:时间复杂度:O(nlogn)\ O(nlogn) ,空间复杂度:O(n)\ O(n) 
输入描述:
第一行输入要排序的人的个数n,第二行输入一个整数表示排序的方式,之后n行分别输入他们的名字和成绩,以一个空格隔开

输出描述:
按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开
解:let num=readline()
let px=readline()
const arr=[]
let student=""
let xu=0
while(student=readline()){
    const obj={}
  let n=  student.split(' ')
   obj.name=n[0]
    obj.fen=n[1]
    xu+=1
    obj.id=xu
    arr.push(obj)
}
arr.sort((a,b)=>{
   if(a.fen==b.fen){
       return a.id-b.id
   }else if(px==1){
       return a.fen-b.fen
   }else if(px==0){
       return b.fen-a.fen
   }         
}).forEach(i=>console.log(i.name,i.fen))
————————————————————————
描述
给出一个仅包含字符'(',')','{','}','['和']',的字符串,判断给出的字符串是否是合法的括号序列
括号必须以正确的顺序关闭,"()"和"()[]{}"都是合法的括号序列,但"(]"和"([)]"不合法。

数据范围:字符串长度 0\le n \le 100000≤n≤10000
要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)
示例1
输入:
"()[]{}"
返回值:
true

示例2
输入:
"[]"

返回值:
true

示例3
输入:
"([)]"

返回值:
false
解:/**
  * 
  * @param s string字符串 
  * @return bool布尔型
  */
//简单暴力
function isValid( s ) {
    let arr = [];
    for(let i = 0; i < s.length; i++){
if((arr[arr.length - 1] == '(' && s[i] == ')') || (arr[arr.length - 1] == '[' && s[i] == ']' ) || (arr[arr.length - 1] == '{' && s[i] == '}'))
            arr.pop();
        else
            arr.push(s[i]);
    }
    if(arr.length == 0)
        return true;
    else
        return false;
}
module.exports = {
    isValid : isValid
};
——————————————————————————
描述
对于长度为n的一个字符串A(仅包含数字,大小写英文字母),请设计一个高效算法,计算其中最长回文子串的长度。

输入:"ababc"

返回值:3

说明:
最长的回文子串为"aba"与"bab",长度都为3  

输入:"abbba"

返回值:5

输入:"b"
返回值:1
解:遍历每个字符,以该字符为中心,不断向两边扩展,求回文字符串的最大长度

注意分为奇偶,比如xyzabbaxyz,b为中心的时候分为b和bb
function getLongestPalindrome( A ) {
   
  function getLength(begin,end){
    while(begin>=0 && end<A.length && A[begin]==A[end]){
      begin--;
      end++;
    }
    return end-begin-1;//返回长度
  }
   
  let maxLen = 1;
  for(let i=0; i<A.length-1; i++){//以每个点为中心
    maxLen = Math.max( maxLen, getLength(i,i), getLength(i,i+1) );
  }
  return maxLen;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值