1.配列内の出現回数が半分を超えている
問題の説明:
配列の半分の長さを超える数が配列にあります。この数を見つけてください。たとえば、長さ[1,2,3,2,2,2,5,4,2]の配列を入力します。数値2は配列に5回出現するため、配列の長さの半分以上なので、出力2になります。存在しない場合は0を出力します。
function MoreThanHalfNum_Solution(numbers) {
// write code here
var len = numbers.length;
var obj = {};
numbers.forEach((item) => {
if (!obj[item]) {
obj[item] = 1;
} else {
obj[item]++;
}
});
for (let key in obj) {
if (obj[key] > len / 2) {
return key;
}
}
return 0;
}
2. Kの最小数
問題の説明:
n個の整数を入力して、最小のK数を見つけます。たとえば、4、5、1、6、2、7、3、および8桁を入力すると、最小の4桁は1、2、3、および4になります。
方法1:クイックソート
function GetLeastNumbers_Solution(input, k) {
// write code here
if (k > input.length) return [];
quickSort(input);
return input.slice(0, k);
}
function quickSort(input, left = 0, right = input.length - 1) {
if (left >= right) return;
var baseId = left;
var baseVal = input[baseId];
var i = left;
var j = right;
while (i < j) {
while (j > i && input[j] >= baseVal) {
j--;
}
while (i < j && input[i] <= baseVal) {
i++;
}
[input[i], input[j]] = [input[j], input[i]];
}
[input[baseId], input[j]] = [input[j], input[baseId]];
quickSort(input, left, j - 1);
quickSort(input, j + 1, right);
return input;
}
方法2:バブルソート
function GetLeastNumbers_Solution(input, k) {
// write code here
if (k > input.length) return [];
for (let j = input.length - 1; j >= input.length - k; j--) {
for (let i = 0; i < j; i++) {
if (input[i] < input[i + 1]) {
[input[i], input[i + 1]] = [input[i + 1], input[i]];
}
}
}
var res = [];
while (k > 0) {
res.push(input.pop());
k--;
}
return res;
}
方法3:並べ替え
function GetLeastNumbers_Solution(input, k) {
// write code here
if (input.length < k) {
return [];
}
input.sort((a, b) => a - b);
return input.slice(0, k);
}
3.連続するサブアレイの最大合計
問題の説明:
HZは、コンピュータ以外のメジャーをだますために、専門的な質問をすることがあります。今日のテストグループミーティングの後、彼は再び話しました:古代の1次元パターン認識では、連続するサブベクトルの最大合計を計算する必要がしばしばあります。ベクトルがすべて正の数である場合、問題はうまく解決されます。ただし、ベクトルに負の数が含まれている場合、負の数が含まれていて、その横にある正の数がそれを補うことを期待する必要がありますか?例:{6、-3、-2,7、-15,1,2,2}、連続するサブベクトルの最大合計は8(0から3番目まで)。配列を与えて、その最大の連続したサブシーケンスの合計を返します、あなたは彼にだまされますか?(サブベクトルの長さが少なくとも1です)
/*
举例:array = [1, -2, 3, 10, -4, 7, 2, -5]
初始化 max = 1, temp = 1
i = 1时, temp = -1, max = 1
i = 2时, temp = 3, max = 3
i = 3时, temp = 13, max = 13
i = 4时, temp = 9 , max = 13
i = 5时, temp = 16, max = 16
i = 6时, temp = 18, max = 18
i = 7时, temp = 13, max = 18;
*/
function FindGreatestSumOfSubArray(array) {
// write code here
var max = array[0],
sum = array[0];
for (let i = 1; i < array.length; i++) {
if (sum <= 0) {
sum = array[i]; //sum是负数说明前面的数没有贡献,重新赋值一个数
} else {
sum += array[i]; //sum不是负数说明当前值有贡献
}
if (sum > max) {
max = sum;
}
}
return max;
}
4.整数の1の出現数(1からnの整数の1の出現数)
タイトルの説明:
1から13までの整数で1の出現数を見つけて、100から1300までの整数で1の出現数を計算しますか?このため、1〜13の1を含む数字を1、10、11、12、13と数えて合計6回出現したが、後者の問題は間違いではなかった。ACMerはあなたが彼を助け、問題をより一般的にすることを望んでいます。負でない整数間隔(1から1までの1の発生数)で1の発生数をすばやく見つけることができます。
方法1:各桁について、残りの10(%10)を取得して場所を見つけ、元の数値を10で割って四捨五入し、残りの10を取得して10を得る...など
function NumberOf1Between1AndN_Solution(n) {
// write code here
var count = 0;
for (let i = n; i > 0; i--) {
for (let j = i; j > 0; j = parseInt(j / 10)) {
//对j/10取整
if (j % 10 === 1) {
count++;
}
}
}
return count;
}
方法2:愚かな方法、1をnを文字列に変換し、一緒にステッチして1の数を計算する
function NumberOf1Between1AndN_Solution(n) {
// write code here
var str = "";
for (let i = 0; i <= n; i++) {
str += i;
}
var res = str.split("").filter((ele) => ele === "1");
return res.length;
}
5.整数を最小数に配置します
問題の説明:
正の整数の配列を入力し、配列内のすべての数値を連結して数値を形成し、連結できるすべての数値の最小値を出力します。たとえば、配列{3、32、321}を入力した場合、これら3つの数値で配置できる最小の数値は321323です。
問題解決のアイデア:
配列内の数値を接続して、最小の数値を形成します。「大きな数」と「10進数」を前に戻し、「大きな数」と「10進数」を定義するにはどうすればよいですか?たとえば、aとbの2つの数値があります。ab> baの場合、aは「大きな数」、bは「10進数」であり、baとして配置する必要があります。
その結果、この質問は並べ替えの問題になり、結合された数値を構成できる数値は元に戻ります。ここで、比率の比較方法を定義する必要があります。バブルソートはこの問題を解決できます。
function PrintMinNumber(numbers) {
// write code here
numbers.sort((a, b) => {
return "" + a + b > "" + b + a ? 1 : -1; // ab 和 ba ASCII码值大的排在后面
// return [a,b].join("")-[b,a].join("");
});
return numbers.join("");
}