题目:
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
在构造过程中,请注意区分大小写。比如 "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;
};
题目:
写一个程序,输出从 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;
};
题目:给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是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;
};
题目:
给定两个字符串形式的非负整数 num1
和num2
,计算它们的和。
注意:
num1
和num2
的长度都小于 5100.num1
和num2
都只包含数字 0-9
.num1
和num2
都不包含任何前导零。思路:从末尾相加,大于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}`;
};
题目:
统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符。
请注意,你可以假定字符串里不包括任何不可打印的字符。
思路:依次遍历,遇到空格则判断之前是否出现过字符,如果出现过字符,就遇到空格说明是一个新的单词。
/**
* @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
};