华为机试题练习(二)

  1. 正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。
    输入
    5 7
    输出
    35
while(line = readline()){
    var arr = line.split(' ').map(function(item){
        return parseInt(item);
    });
    var a = parseInt(arr[0]);
    var b = parseInt(arr[1]);
    var num = a * b;
    while(a % b) {
        var c = a % b;
        a = b;
        b = c;
    }
    console.log(num/b);
}
  1. 密码要求:
    1.长度超过8位
    2.包括大小写字母.数字.其它符号,以上四种至少三种
    3.不能有相同长度超2的子串重复
    输入描述:
    一组或多组长度超过2的子符串。每组占一行
while(line=readline()){
    console.log(check(line));
}
function check(str) {
    if(str.length <= 8){
        return "NG"
    }
    var count = 0;
    var reg1 = /[A-Z]/;
    var reg2 = /[a-z]/;
    var reg3 = /[0-9]/;
    if(reg1.test(str)){
        count++;
    }
    if(reg2.test(str)){
        count++;
    }
    if(reg3.test(str)){
        count++;
    }
    if(count<2){
        return 'NG';
    }else if(count == 2 && line.replace(/[A-Za-z0-9]/g,' ').length == 0){
        return 'NG';
    }
    for(var i=0;i<(line.length-3);i++){
        var temp = line.substr(i,3);
        //判断重复
        if(line.lastIndexOf(temp)>i){
            return 'NG';
        }
    }
    return 'OK';
}
  1. 密码问题
    手机按键上对应:1–1, abc–2, def–3, ghi–4, jkl–5, mno–6, pqrs–7, tuv–8 wxyz–9, 0–0,把密码中出现的小写字母都变成对应的数字,数字和其他的符号都不做变换,大写字母则变成小写字母后往后移一位,如:X,先变成小写,再往后移一位,就是y了嘛,注意,z往后移是a。
    输入
    YUANzhi1987
    输出
    zvbo9441987
function check(pw){
    var reg1 = /[A-Z]/g;
    var reg2 = /[a-c]/g;
    var reg3 = /[d-f]/g;
    var reg4 = /[g-i]/g;
    var reg5 = /[j-l]/g;
    var reg6 = /[m-o]/g;
    var reg7 = /[p-s]/g;
    var reg8 = /[t-v]/g;
    var reg9 = /[w-z]/g;
    var pw1 = pw.replace(reg2,'2');
    var pw2 = pw1.replace(reg3,'3');
    var pw3 = pw2.replace(reg4,'4');
    var pw4 = pw3.replace(reg5,'5');
    var pw5 = pw4.replace(reg6,'6');
    var pw6 = pw5.replace(reg7,'7');
    var pw7 = pw6.replace(reg8,'8');
    var pw8 = pw7.replace(reg9,'9');
    var pw9 = pw8.replace(reg1,function($0,$1,$2){
        for(var i =0;i<$0.length;i++){
            if($0 != 'Z'){
                return String.fromCharCode($0.charCodeAt() + 1).toLowerCase();
            }else{
                return 'a';
            }
             
        }
    })
    return pw9;
}
while(line = readline()){
    console.log(check(line));
}

16.实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。
输入
abcdd
输出
dd

while(line = readline()){
    var obj = {};  //用对象存字符串与次数
    var res = '';
    for(var i=0; i<line.length; i++){
        if(!obj[line[i]]) {
            obj[line[i]] = 1;
        } else{
            obj[line[i]]++;
        }
    } 
    var min = line.length;
    for(var item in obj){  //取到出现次数最少的字符的次数
        if(obj[item]<min){
            min = obj[item];
        }
    }
    for(var i=0; i<line.length; i++){
        if(obj[line[i]] != min){
            res+=line[i];
        }
    }
    print(res);
}
  1. 一个DNA序列由A/C/G/T四个字母的排列组合组成。G和C的比例是序列中G和C两个字母的总的出现次数除以总的字母数目(也就是序列长度)。
    给定一个很长的DNA序列,以及要求的最小子序列长度,在其中找出GC-Ratio最高的子序列。
    输入
    AACTGTGCACGACCTGA
    5
    输出
    GCACG
while(str=readline()){       
    var n=parseInt(readline());      
    var result="";
    var max=0;      
    for(var i=0,len=str.length;i<len-n;i++){          
        var temp=str.substr(i,n);
        var tempcount=0;
        //找到子字符串中GC最多的子串   
        for(var j=0;j<n;j++){
            if(temp[j]=="C" || temp[j]=="G"){
               tempcount++;
            }
        }          
        if(tempcount>max){
            max=tempcount;
            result=temp;         
        }                   
    }       
    if(str.length>n){
       print(result);
    }else{
        print(str);
    }           
}
  1. 实现一个二维数组转置的方法。
var arr1 = [[30, -1, 90], [70, 100, -40], [39, 29, 6]];
var arr2 = [];
//确定新数组有多少行
for (var i = 0; i < arr1[0].length; i++) {
    arr2[i] = [];
}
//动态添加数据
//遍历原数组
for (var i = 0; i < arr1.length; i++) {
    for (var j = 0; j < arr1[i].length; j++) {
        arr2[j][i] = arr1[i][j];
    }
}
//打印新数组
for (var i = 0; i < arr2.length; i++) {
    for (var j = 0; j < arr2[i].length; j++) {
        console.log(arr2[i][j]);
    }
    console.log("<br />");
}
  1. 求最长回文子串
    暴力法:
    var longestPalindrome = function(s) {
    let n = s.length;
    let result = ‘’
    for(let i = 0;i<n;i++){
    for(let j=i+1;j<=n;j++){
    let str = s.slice(i,j);
    let f = str.split(’’).reverse().join(’’);

        if(str == f){
            result = str.length > result.length ? str : result;
        }
    }
    

    }
    console.log(result);

    return result;
    };

对称查找法:
一核对称:121、12321、1
双核对称:11、1221、123321
先枚举每一个字符,再针对该字符进行左右(双核对称时为当前字符和下一个字符)查找相等匹配

var longestPalindrome = function(s) {
    var max = '';
    var len = s.length
    if(len < 2) return s;
    for (var i = 0; i <= len; i++) {
          var max_new = core(s,len,i)
          max = max_new.length > max.length ? max_new : max;
    }
    return max;
};

function core(str, str_len, str_i){
    var max_1 = loop(str_i-1, str_i+1); // 一核对称 str_len >= 3 str_i = 1
    var max_2 = loop(str_i, str_i+1); // 双核对称 str_len >= 2 str_i = 0
    return max_1.length > max_2.length ? max_1 : max_2;
    
    function loop(pre, next){
        if(!str[pre] || !str[next]) return str.slice(pre+1, next);
        if(str.charAt(pre) === str.charAt(next)) return loop(pre-1, next+1)
        else return str.slice(pre+1, next)
    }
}
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值