我怎么知道字符串中的字符在内置通配符时是否重复了相同的次数?
How can I know if the characters of a string repeat themselves the same amount of times when they have a wildcard built-in?
示例:
testing("xyzy**")
应该是 true
.
testing("xyzy*")
应该是 false
.
推理:
- 在第一种情况下,这是真的,因为一个
*
可以表现为 x
而另一个 z
,所以所有字符都具有相同数量的 y
.
- 在第二种情况下,不会有相同数量的字符重复,因为只有一个
*
,所以它是错误的。
这是我到目前为止的情况:
const testing = string => {
var array = []; //array with each character without repeating
var array_R = []; //array with the value the value that each character repeats itself
var array_C = 0; //counter for the size of "array"
//getting the character without repeating
for (var i = 0; i < string.length; i++) {
if (!array.includes(string.charAt(i))) {
array[array_C] = string.charAt(i);
array_R[array_C] = 0;
array_C++;
}
}
//how many each character repeats itself
for (var i = 0; i < array.length; i++) {
for (var j = 0; j < string.length; j++) {
if(array[i] == string.charAt(j)){
array_R[i] = array_R[i] + 1;
}
}
}
}
我真的不知道如何从这里开始。
首先统计每个非*
字符在对象或Map中出现的次数。找到该集合中的最大值,然后找到最大值与每个值之间的所有差异的总和。如果星号的个数与差之和相同,则满足重复条件
你还必须考虑这样的情况,即在所有孔都被填满以使值相等之后还剩下更多的星号 - 算出剩下多少,看看它是否平均划分了分隔字符。
const testing = (str) => {
const grouped = {};
for (const char of str) {
if (char !== '*') grouped[char] = (grouped[char] || 0) + 1;
}
const values = Object.values(grouped);
const numOfSeparateChars = values.length;
const max = Math.max(...values);
const sum = values.reduce((a, b) => a + b, 0);
const sumOfDifferencesFromMax = max * numOfSeparateChars - sum;
const numberAsterisks = (str.match(/\*/g) || []).length;
const remainingAsterisks = sumOfDifferencesFromMax - numberAsterisks;
// Now all characters have been filled in to make the values even
// eg: 'abcc**' -> 'abccab'
// But there may be more asterisks
// eg: 'abcc*****' -> 'abccaabbc'
return remainingAsterisks % numOfSeparateChars === 0;
};
console.log(testing("xyzy**"));
console.log(testing("xyzy*"));
示例:
testing("xyzy**")
应该是true
.testing("xyzy*")
应该是false
.
推理:
- 在第一种情况下,这是真的,因为一个
*
可以表现为x
而另一个z
,所以所有字符都具有相同数量的y
. - 在第二种情况下,不会有相同数量的字符重复,因为只有一个
*
,所以它是错误的。
这是我到目前为止的情况:
const testing = string => {
var array = []; //array with each character without repeating
var array_R = []; //array with the value the value that each character repeats itself
var array_C = 0; //counter for the size of "array"
//getting the character without repeating
for (var i = 0; i < string.length; i++) {
if (!array.includes(string.charAt(i))) {
array[array_C] = string.charAt(i);
array_R[array_C] = 0;
array_C++;
}
}
//how many each character repeats itself
for (var i = 0; i < array.length; i++) {
for (var j = 0; j < string.length; j++) {
if(array[i] == string.charAt(j)){
array_R[i] = array_R[i] + 1;
}
}
}
}
我真的不知道如何从这里开始。
首先统计每个非*
字符在对象或Map中出现的次数。找到该集合中的最大值,然后找到最大值与每个值之间的所有差异的总和。如果星号的个数与差之和相同,则满足重复条件
你还必须考虑这样的情况,即在所有孔都被填满以使值相等之后还剩下更多的星号 - 算出剩下多少,看看它是否平均划分了分隔字符。
const testing = (str) => {
const grouped = {};
for (const char of str) {
if (char !== '*') grouped[char] = (grouped[char] || 0) + 1;
}
const values = Object.values(grouped);
const numOfSeparateChars = values.length;
const max = Math.max(...values);
const sum = values.reduce((a, b) => a + b, 0);
const sumOfDifferencesFromMax = max * numOfSeparateChars - sum;
const numberAsterisks = (str.match(/\*/g) || []).length;
const remainingAsterisks = sumOfDifferencesFromMax - numberAsterisks;
// Now all characters have been filled in to make the values even
// eg: 'abcc**' -> 'abccab'
// But there may be more asterisks
// eg: 'abcc*****' -> 'abccaabbc'
return remainingAsterisks % numOfSeparateChars === 0;
};
console.log(testing("xyzy**"));
console.log(testing("xyzy*"));