每日2道算法题

leetcode整数反转

let x = -123;
// number->string->array->string->number->judge
let reverse = function(x) {
    let res = [];
    let str = x.toString();
    //字符串也有length属性
    for(let i = str.length - 1; i > 0; i --){
        res.push(str[i]);
    }
    if(str[0] === '-'){
        res.unshift(str[0]);
    }else{
        res.push(str[0]);
    }
    //join()是把数组里的每个元素合并成字符串了
    let reverseNumber = parseInt(res.join(""));
    if(reverseNumber < Math.pow(-2,31) || reverseNumber > (Math.pow(2,31) - 1)){
        return 0;
    }else
        return reverseNumber;
};
console.log(reverse(x));

leetcode两数之和

let nums = [2,7,4,11],target = 9;
var twoSum = function(nums, target) {
 for(let i = 0; i < nums.length; i ++){
     for(let j = i+1; j < nums.length; j ++){
         if(nums[j] == target - nums[i])
             return [i,j];
     }
 } 
};
console.log(twoSum(nums,target));

回文数:

//先将'-121'变成['-','1','2','1']然后变成['1','2','1','-']然后变成'121-',最后比较'-121'和'121-'
function f(x) {
    let str = x.toString();
    let arr = str.split('').reverse();//split()可以把字符串变成数组
    let result = arr.join('');//join()可以把数组变成字符串
    if(str === result){
        return true;
    }else{
        return false;
    }
}
let x = -121;
f(x);

最长公共前缀:

let str = ['flower','flow','flight'];
var longestCommonPrefix = function(strs) {
    if (strs.length === 0) {
        return '';
    }
    let a = strs[0];
    for(let i = 0; i < a.length; i++) {
        for(let j = 1; j < strs.length; j++) {
            if (a[i] !== strs[j][i]) {//比较独特的数组访问方式,要记住
                return a.substring(0, i);//不接受负数,提取子字符串,从0号位置开始提取,提取到i-1的位置
            }
        }
    }
    return a;
};
console.log(longestCommonPrefix(str));

有效的括号:

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function (s) {
    let map = {
        '{':'}',
        '[':']',
        '(':')'
    };
    const arr = ['{','[','('];
    const stack = [];//这个栈为啥是const型的
    for(let item in s) {
        const v = s[item];
        if(arr.indexOf(v) !== -1){
            stack.push(v);
        }else{
            const peak = stack.pop();
            if(v !== map[peak])
                return false;
        }
    }
    
    if(stack.length !== 0) return false;
    else return true;
};
let str = "{[()]}";
console.log(isValid(str));

26:删除排序数组中的重复项

下面这种方法的前提:有序数组

方法的思路:采用双指针

  • 开始时这两个指针都指向第一个数组元素;

  • 如果两个指针指的数组元素相同,则快指针向前走一步;

  • 如果不同,则两个指针都向前走一步,并将慢指针指向的数组元素替换为快指针指向的数组元素;

  • 当快指针走完整个数组后,慢指针当前的坐标加1就是数组中不同元素的个数

/**
 * @param {number[]} nums
 * @return {number}
 */
var removeDuplicates = function(nums) {
    const size = nums.length;
    let slowP = 0;
    for (let fastP = 0; fastP < size; fastP++) {
        if (nums[fastP] !== nums[slowP]) {
            slowP++;
            nums[slowP] = nums[fastP]
        }   
    }
    return slowP + 1;
};

27:移除元素

方法思路:

当 nums[j] 与给定的值相等时,递增 j 以跳过该元素。只要 nums[j]  !== val ,我们就复制 nums[j] 到 nums[i] 并同时递增两个索引。重复这一过程,直到 j 到达数组的末尾,该数组的新长度为 i。(其实是变相的替换操作)

var removeElement = function(nums, val) {
    let i = 0;
    for(let j = 0; j < nums.length; j++){
        if(nums[j] !== val){
            nums[i] = nums[j];
            i++;
        }
    }
    return i;
};

28.翻转字符串中的单词

代码:

var reverseWords = function (s) {
    if(s.length === 0) return "";
    let [index,len] = [0,s.length];
    let result = "";
    let storge = "";
    while(index < len) {
        while(index < len && s.charAt(index) === ' ') {
            index ++;
        }
        while(index < len && s.charAt(index) !== ' ') {
            storge = `${storge}${s.charAt(index)}`;
            index ++;
        }
        result  = storge + " " + result;
        storge = ""
    }
    return result.trim();
}
console.log(reverseWords("  Hello   World   "));

思路:

 1)跳过句子前所有空格(让索引一步一步往前走,用一个变量把非空格字符存起来)
 2)借助变量反转单词,每遍历到一个字符,在遇到下一个空格之前,为一个完整单词。
 3)遇到空格之后,将单词进行倒序拼接
 4)消除头部尾部的空格(trim())

29.实现一个RGB到16进制的转换函数

代码:

let testColor = "rgb(20, 20, 20)";
const rgbToHex = (color) => {
    let arr = color.split(',');

    let r = +arr[0].split('(')[1];
    let g = +arr[1];
    let b = +arr[2].split(')')[0];
    let value = (1 << 24) + r * (1 << 16) + g * (1 << 8) + b;
    value = value.toString(16);
    console.log(value);
    return '#' + value.slice(1);
};
console.log(rgbToHex(testColor)); // #141414
console.log(rgbToHex('rgb(255, 255, 255)')) // #fffff

Q: 找出一个字符串中出现最多的字母,并判断出现的次数 

let arr = []
let str = "success"
for(let i =0; i < str.length; i++) {
    let index = -1;
    let j = 0;
    do {
        index = str.indexOf(str[i],index+1)
        if(index != -1) {
            j++;//记录每个字符出现的次数
        }
    } while (index != -1)
    arr[j] = str[i];
}
console.log(arr[arr.length-1],arr.length-1)

//第二种方法:利用Object中的key进行筛选(首选)

function func(str) {
    if(str.length === 1){
        return str;
    }
    let obj = {};
    for(let i = 0; i < str.length; i ++){//对字符串进行遍历
        if(!obj[str.charAt(i)]){//str.charAt(i):a b c
            obj[str.charAt(i)] = 1;//obj['a'] = 3;obj['b'] = 3;obj['c'] = 2
        }else{
            obj[str.charAt(i)] += 1;
        }
    }
    /*
    {
        a : 3,
        b : 3,
        c : 2
    }
    */
    let maxChar = "";
    let maxValue = 1;
    for(let key in obj){//对对象进行遍历
        if(obj[key] > maxValue){
            maxValue = obj[key];
            maxChar = key;
        }
    }
    console.log(maxChar + maxValue);
}
let str = "aabbbcac";
func(str);

Q:  找出一个字符串中的最后一个字符

var str = "123";
var res = str.substr(-1,1);
console.log(res);

Q: 求一个数组中最大的差值

function getMaxProfit(arr) {
    let min = arr[0];
    let maxProfit = 0;
    for (let i = 0; i < arr.length; i++) {
        let current = arr[i];
        min = Math.min(min, current);
        let profit = current - min;
        maxProfit = Math.max(maxProfit, profit);
    }
    return maxProfit;
}
console.log(Math.max(12,3,4));

Q: 随机生成指定长度的字符串

实现一个算法,随机生成指制定长度的字符串

比如给定 长度 8  输出 4ldkfg9j
function randomString(n) {
    let str = 'abcdefghijklmnopqrstuvwxyz9876543210';
    let tmp = '', len = str.length;
    for (let i = 0; i < n; i++) {
        tmp += str.charAt(Math.floor(Math.random() * len));
    }
    return tmp;
}
let n = 8;
console.log(randomString(n));

Q:字符串查找:判断字符a是否被包含在字符b中,并返回第一次出现的位置(找不到返回-1)

a = "34"; b = "1234567"; //返回2

a = "35"; b = "1234567";//返回-1

a = "355";b = "12354355";//返回5

function isContain(a,b){
    for(let index in b){
        if(a[0] === b[index]) {
            let temp = true;
            for (let i in a) {
                if (a[i] !== b[~~index + ~~i]) {
                    temp = false;
                }
            }
            if (temp) {
                return index;
            } else {
                return -1;
            }
        }
    }
}
let a = "34",b = "1234567"
console.log(isContain(a, b));

Q:给定一个字符串s,找出s中最长的回文子串,你可以假设s的最大长度为1000

例如:用例字符串是:"gabcdcbaef",那么最大回文子串是:"abcdcba"


function lpds(str) {
    // 请输入代码
    let len = str.length;
    let drr = [];
    for(let i = 0; i < len; i ++){
        let arr =[];
        arr[i] = true;
        drr[i] = arr;
    }
    for(let i = 0; i < len;  i++){
        if(str[i] === str[i + 1])
            drr[i][i+1]  = true;
    }
    let maxLen = 1,resIndex = 0;
    for(let lenn = 3; lenn <= len; lenn ++){
        for(let i = 0;i < len - lenn + 1; i ++){
            if(str[i] === str[i + lenn - 1] && drr[i +1][i + lenn - 2]){
                drr[i][i+lenn - 1] = true;
                if(lenn > maxLen){
                    maxLen = lenn;
                    resIndex = i;
                }
            }
        }
    }
    return str.substr(resIndex,maxLen);

}
while(line=readline()){
    print(lpds(line));
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值