题目:给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。
思路:可以遍历从下标0到长度的一半,如果当前的长度除总长度的余数为0,说明长度可以整除。然后重复这个字符串到总长度,和原字符串相比,如果相等,则满足条件。如果到l/2还没找到相等的,则不满足条件
/**
* @param {string} s
* @return {boolean}
*/
var repeatedSubstringPattern = function(s) {
const l = s.length;
if (l < 2) return false;
for (let i = 1; i <= l / 2; i++) {
if (!(l % i) && s.slice(0, i).repeat(l / i) === s) return true;
}
return false;
};
题目:
两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
给出两个整数 x
和 y
,计算它们之间的汉明距离。
思路:转成二进制然后计算
/**
* @param {number} x
* @param {number} y
* @return {number}
*/
var hammingDistance = function(x, y) {
const s1 = x.toString(2).padStart(32, "0");
const s2 = y.toString(2).padStart(32, "0");
let res = 0;
for (let i = 0; i <= 32; i++) {
if (s1[i] !== s2[i]) res++;
}
return res;
};
题目:
给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域。
网格中的格子水平和垂直方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。
岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。
思路:观察可知,计算总的岛屿方格数,减去重复的边*2,即为岛屿的周长
/**
* @param {number[][]} grid
* @return {number}
*/
var islandPerimeter = function(grid) {
const length = grid.length;
if (!length) return 0;
let res = 0;
let a = 0;
const height = grid[0].length;
for (let i = 0; i < length; i++) {
for (let j = 0; j < height; j++) {
if (grid[i][j] === 1) {
res++;
if (grid[i - 1] && grid[i - 1][j] === 1) {
a++;
}
if (grid[i][j - 1] === 1) {
a++;
}
if (grid[i][j + 1] === 1) {
a++;
}
if (grid[i + 1] && grid[i + 1][j] === 1) {
a++;
}
}
}
}
return 4 * res - a;
};
题目:
有一个密钥字符串 S ,只包含字母,数字以及 '-'(破折号)。其中, N 个 '-' 将字符串分成了 N+1 组。
给你一个数字 K,请你重新格式化字符串,除了第一个分组以外,每个分组要包含 K 个字符;而第一个分组中,至少要包含 1 个字符。两个分组之间需要用 '-'(破折号)隔开,并且将所有的小写字母转换为大写字母。
给定非空字符串 S 和数字 K,按照上面描述的规则进行格式化。
思路: 先计算去除-的字符的长度能否被K整除,可以的话,说明每个分组的长度为K,不能的话,第一个分组的长度就是余数
/**
* @param {string} S
* @param {number} K
* @return {string}
*/
var licenseKeyFormatting = function(S, K) {
S = S.toUpperCase().replace(/-/g, "");
const l = S.length;
if(l<=K)return S
const n = l % K;
let res = "";
res = !n ? "" : `${S.slice(0, n)}-`;
for (let i = 0; i + n < l; i++) {
if (!(i % K)&&i) {
res += `-${S[i + n]}`;
} else {
res += `${S[i + n]}`;
}
}
return res;
};
题目:给定一个二进制数组, 计算其中最大连续1的个数。
思路:每次遇到1就累加,遇到0,将当前累加数和最大值比较取最大值,结束的时候再取一次
/**
* @param {number[]} nums
* @return {number}
*/
var findMaxConsecutiveOnes = function(nums) {
let res = 0;
let temp = 0;
for (const i of nums) {
if (i) {
temp++;
} else {
res = temp > res ? temp : res;
temp = 0;
}
}
res = temp > res ? temp : res;
return res;
};