华为od的一些算法题

【报数游戏】100个人围成一圈,每个人有一个编码,编号从1开始到100。他们从1开始依次报数,报到为M的人自动退出圈圈,然后下一个人接着从1开始报数,直到剩余的人数小于M。请问最后剩余的人在原先的编号为多少?

输入描述:输入一个整数参数M
输出描述:如果输入参数M小于等于1或者大于等于100,输出“ERROR!”;否则按照原先的编号从小到大的顺序,以英文逗号分割输出编号字符串
示例1:
输入
输出
3
58,91

function baoshu(num, numArr, item) {
    let newArr = [];
    for (let index = 0; index < numArr.length; index++) {
        if (item !== num) {
            newArr.push(numArr[index])
            item++;
        } else {
            item = 1;
        }
    }
    if (newArr.length < num) {
        console.log(newArr);
    } else {
        baoshu(num, newArr, item)
    }
}
function make(num) {
    let arr = []
    for (let i = 0; i < num; i++) {
        arr.push(i + 1)
    }
    return arr;
}
baoshu(4, make(100), 1)

编写函数,计算输入中单词的出现次数。

Ⅰ按次数降序输出,
Ⅱ相同次数的按字母顺序升序排序。
New to Python or choosing between Python 2 and Python 3? Read Python 2 or Python 3
正确结果为:
Python : 5
2 : 2
or : 2
3 : 1
3? : 1
New : 1
Read : 1
and : 1
between : 1
choosing : 1
to : 1

function find(str) {
    let arr = [];
    str.split(' ').forEach(item => {
        let bool = false;
        arr.forEach((item2, index) => {
            if (item2.key === item) {
                bool = true;
                arr[index].value += 1;
            }
        })
        if (!bool) {
            arr.push({
                key: item,
                value: 1
            })
        }
    });
    arr.sort((a,b)=>{
        if(a.value == b.value){
            if(a.key>b.key){
                return 1;
            }else{
                return -1;
            }
        }else{
            return b.value-a.value;
        }
    })
    return arr;
}
let str = 'New to Python or choosing between Python 2 and Python 3? Read Python 2 or Python 3'
console.log(find(str));

编写函数,给定var a = (5).plus(3).minus(6); 为 2 相当于(5+3-6=2)

//在原型上添加方法
Number.prototype.plus =  function(num){  return this + num;  }
Number.prototype.minus = function(num){  return this - num;  }
var a = (5).plus(3).minus(6); 

给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。

输入:nums = [1,2,3,1], k = 3
输出:true
示例 2:

输入:nums = [1,0,1,1], k = 1
输出:true
示例 3:

输入:nums = [1,2,3,1,2,3], k = 2
输出:false
//第一种方法
function find(arr, k) {
    let set = new Set();
    let len = arr.length;
    for (let i = 0; i < len; i++) {
        if(i>k){
            set.delete(arr[i-k-1])
        }
        if(set.has(arr[i])){
            return true;
        }
        set.add(arr[i])
    }
    return false;
}
//第二种方法
function find2(nums, k) {
    const map = new Map();
    const length = nums.length;
    for (let i = 0; i < length; i++) {
        const num = nums[i];
        if (map.has(num) && i - map.get(num) <= k) {
            return true;
        }
        map.set(num, i);
    }
    return false;
};
console.log(find([1,0,1,1],1));
console.log(find2([1,0,1,1],2));

反转每对括号间的子串

function reverse(s) {
    let stk = [];
    let str = '';
    for (const ch of s) {
        if (ch == '(') {
            stk.push(str);
            str = ''
        } else if (ch == ')') {
            str = str.split('').reverse().join('');
            str = stk[stk.length - 1] + str;
            stk.pop();
        } else {
            str +=ch;
        }
    }
    return str;
}

console.log(reverse('(ab(cd)ef)'));

编写一个函数来查找字符串数组中的最长公共前缀。

function find(strs) {
    if (strs.length === 0) {
        return '';
    }
    let ans = strs[0];
    for (let i =1;i<strs.length;i++) {
        let j = 0;
        for (; j < ans.length && j < strs[i].length; j++) {
            if (ans[j] != strs[i][j]) {
                break;
            }
        }
        ans = ans.substr(0, j);
        if (ans === '') {
            return ans;
        }
    }
    return ans;
}
console.log(find(['flower','flowsd','flossf']));

给你一个字符串 s ,请你返回满足以下条件的最长子字符串的长度:每个元音字母,即 ‘a’,‘e’,‘i’,‘o’,‘u’ ,在子字符串中都恰好出现了偶数次。

var findTheLongestSubstring = (str) => {
    let res = 0 
    let state = 0 // 前缀区间的state状态
    let vowel = { a: 1, e: 2, i: 4, o: 8, u: 16 } // 对照表
    let map = { 0: -1 } // map存放各个前缀区间的state
    for (let i = 0; i < str.length; i++) { // 遍历str串
        let char = str[i] // 获取当前遍历的字符
        if (vowel[char] !== undefined) { // 当前遍历的字符是元音
            state ^= vowel[char] // 求出当前前缀区间的state
            if (map[state] === undefined) { // 当前state没存过
                map[state] = i // 存入该state,和对应的位置
            }
        }
        let distance = i - map[state] //求距离,即满足条件的子串长度
        res = Math.max(res, distance) // 试图刷新最长记录
    }
    return res
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值