leetcode刷题记录(5)-简单

1.最长回文串

题目:

给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。

在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。

注意:
假设字符串的长度不会超过 1010。

思路:记录每个字符出现的次数,对于偶数的字符,直接加上出现的次数,对于奇数的字符,加上减一的次数。最后判断是否出现过奇数的字符,如果出现过至少一次,结果再加一

/**
 * @param {string} s
 * @return {number}
 */
var longestPalindrome = function(s) {
  const map = new Map();
  for (const i of s) {
    map.set(i, (map.get(i) || 0) + 1);
  }
  let res = 0;
  let flag = false;
  for (const i of map.values()) {
    if (i % 2) {
      res += i - 1;
      if (!flag) {
        res += 1;
        flag = true;
      }
    } else {
      res += i;
    }
  }
  return res;
};

2.Fizz Buzz

题目:

写一个程序,输出从 1 到 n 数字的字符串表示。

1. 如果 n 是3的倍数,输出“Fizz”;

2. 如果 n 是5的倍数,输出“Buzz”;

3.如果 n 同时是3和5的倍数,输出 “FizzBuzz”。

思路:依次判断是否是3/5的倍数,加上对应的字符,都不是是花值为当前序号

/**
 * @param {number} n
 * @return {string[]}
 */
var fizzBuzz = function(n) {
  const res = [];
  let s=''
  for (let i = 1; i <= n; i++) {
       s=''
    if (!(i % 3)) {
        s+='Fizz'
    } 
     if (!(i % 5)) {
      s+='Buzz'
    }
    s=s||`${i}`
    res.push(s)
  }
  return res;
};

3.第三大的数

题目:给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。

思路:既然时间复杂度是O(n),那么必然只有一次遍历

可以用三个数记录最大值、第二大的值,第三大的值。依次比较,如果某个数重复出现就忽略,如果某个数大于第一个数,先交换原来的第三大和第二大的数,然后交换最大的数和第二大的数,最后把新的最大数记录。如果大于最大数小于第二大的数是类似的,先交换第二大的数和第三大的数,然后记录新的第二大的数。如果大于原来的第三大的数,直接记录新的第三大的数。

/**
 * @param {number[]} nums
 * @return {number}
 */
var thirdMax = function(nums) {
    const set=new Set(nums)
 let first = -Infinity;
  let second = -Infinity;
  let third = -Infinity;
  for (const i of set.values()) {
    if (i > first) {
      third = second;
      second = first;
      first = i;
    } else if (i > second) {
      third = second;
      second = i;
    } else if (i > third) {
      third = i;
    }
  }
  return third === -Infinity ? first : third;
};

4.字符串相加

题目:

给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。

注意:

  1. num1 和num2 的长度都小于 5100.
  2. num1 和num2 都只包含数字 0-9.
  3. num1 和num2 都不包含任何前导零。
  4. 你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。

思路:从末尾相加,大于10则进一 

/**
 * @param {string} num1
 * @param {string} num2
 * @return {string}
 */
var addStrings = function(num1, num2) {
  let res = "";
  const l1 = num1.length;
  const l2 = num2.length;
  const l = Math.max(l1, l2);
  let i = 0;
  let flag = false;
  while (i < l) {
    let a = 0;
    let b = 0;
    if (i < l1) {
      a = Number(num1[l1 - 1 - i]);
    }
    if (i < l2) {
      b = Number(num2[l2 - 1 - i]);
    }
    res = `${(a + b+Number(flag)) % 10}${res}`;
    flag = a + b +Number(flag)> 9;
    i++;
  }
  return `${flag?1:''}${res}`;
};

5.字符串中的单词数

题目:

统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符。

请注意,你可以假定字符串里不包括任何不可打印的字符。

思路:依次遍历,遇到空格则判断之前是否出现过字符,如果出现过字符,就遇到空格说明是一个新的单词。

/**
 * @param {string} s
 * @return {number}
 */
var countSegments = function(s) {
  let flag = false;
  let res = 0;
  for (const i of s) {
    if (!flag && i !== " ") {
      flag = true;
    }
    if (flag && i === " ") {
      res++;
      flag = false;
    }
  }
  return res + Number(flag);
};

换个思路:一个单词的的起点,就是某个位置的前一个字符是空格(或者是字符起点),当前字符非空格

/**
 * @param {string} s
 * @return {number}
 */
var countSegments = function(s) {
  let count = 0
  const sLen = s.length
  for (let i = 0; i < sLen; i++) {
    if (s[i] !== ' ') count++
    while (i < sLen && s[i] !== ' ') {
      i++
    }
  }
  return count
};
/**
 * @param {string} s
 * @return {number}
 */
var countSegments = function(s) {
  let count = 0
  const l = s.length
  for (let i = 0; i < l; i++) {
    if(s[i]!==' '&&!i){
        count++
    }else if(s[i]!==' '&&s[i-1]===' '){
        count++
    }
  }
  return count
};

 

你可能感兴趣的:(leetcode-简单难度)