该函数必须从参数列表中提供的字符读取,然后在找到两个相同的字符时立即停止,或者当它到达空字节参数时停止。我相信我已经编写了那部分内容。但我无法理解如何解释第一个字符'a';它会跳过那个角色,我无法弄清楚如何比较这两个角色。
/*
var options = {
ListTitle: "",
WebPartID: "",
DisplayField: "Title",
EnforceUnique: true,
AllowEmpty: true,
RequireSelection: true,
NoSelectionMessage: "Please Select a Value",
ConnectedWebPartID: ""
}
*/
//Set Defaults.
dropdownFilterOptions.DisplayField = (typeof dropdownFilterOptions.DisplayField === "undefined" ? "Title" : dropdownFilterOptions.DisplayField);
dropdownFilterOptions.EnforceUnique = (typeof dropdownFilterOptions.EnforceUnique === "undefined" ? true : dropdownFilterOptions.EnforceUnique);
dropdownFilterOptions.AllowEmpty = (typeof dropdownFilterOptions.AllowEmpty === "undefined" ? true : dropdownFilterOptions.AllowEmpty);
dropdownFilterOptions.RequireSelection = (typeof dropdownFilterOptions.RequireSelection === "undefined" ? true : dropdownFilterOptions.RequireSelection);
dropdownFilterOptions.NoSelectionMessage = (typeof dropdownFilterOptions.NoSelectionMessage === "undefined" ? "Please select a value." : dropdownFilterOptions.NoSelectionMessage);
//Parameter Validation.
var parameterValidationSuccess = true;
if (typeof dropdownFilterOptions.ConnectedWebPartID === "undefined") {
throw "ConnectedWebPartID is required!";
parameterValidationSuccess = false;
}
if (typeof dropdownFilterOptions.ListTitle === "undefined") {
throw "ListTitle is required.";
parameterValidationSuccess = false;
}
if (typeof dropdownFilterOptions.WebPartID === "undefined") {
throw "WebPartID is required.";
parameterValidationSuccess = false;
}
if (!parameterValidationSuccess) return;
答案 0 :(得分:1)
主要文字说“一发现两个相同就停止”;代码显示'fancyMostFrequentChar',这意味着你必须计算所有字符并报告最常见的字符。不同的操作。
首先,如果alpha[ci]
不为零,则发现重复;返回它(记住va_end)。否则,将alpha[c1]
设置为1.对于第二个,您必须处理所有参数,然后找到最常见的参数。你必须特别处理第一个参数。你不需要检查它是否重复;事实并非如此。但是你确实需要在alpha
中将正确的条目设置为1.请注意,如果传递非字母,此代码不会禁止,并且它会将大写和小写字母视为相同。
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
char first_duplicate(char c, ...);
int main(void)
{
char c = first_duplicate('a', 'b', 'c', 'd', 'd', 'b', 'a', '\0');
if (c == 'd')
printf("Hooray!\n");
else
printf("fail whale :(\n");
return 0;
}
static inline int map_char(unsigned char u)
{
if (isalpha(u))
return tolower(u) - 'a';
return 26;
}
char first_duplicate(char c, ...)
{
int i;
int alpha[26] = {0};
va_list letters;
va_start(letters, c);
alpha[map_char(c)] = 1;
while ((i = va_arg(letters, int)) != 0)
{
int n = map_char(i);
if (n != 26 && alpha[n] != 0)
{
va_end(letters);
return n + 'a';
}
alpha[n]++;
}
va_end(letters);
return c; // No duplicates spotted - return first letter
}
对于最常见的字母,您必须处理整个参数列表,然后查找哪个条目出现次数最多。
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
char fancyMostFrequentChar(char c, ...);
int main(void)
{
char c = fancyMostFrequentChar('a', 'b', 'c', 'd', 'd', 'b', 'a', '\0');
if (c == 'a')
printf("Hooray!\n");
else
printf("fail whale :(\n");
return 0;
}
static inline int map_char(unsigned char u)
{
if (isalpha(u))
return tolower(u) - 'a';
return 26;
}
char fancyMostFrequentChar(char c, ...)
{
int i;
int alpha[26] = {0};
va_list letters;
va_start(letters, c);
alpha[map_char(c)] = 1;
while ((i = va_arg(letters, int)) != 0)
{
int n = map_char(i);
if (n != 26)
alpha[n]++;
}
va_end(letters);
int maxval = alpha[0];
int maxpos = 0;
for (i = 1; i < 26; i++)
{
if (alpha[i] > maxval)
{
maxval = alpha[i];
maxpos = i;
}
}
return maxpos + 'a';
}
干净地编译并在运行时生成Hooray!
。
请注意,将单个字符串传递给函数会更加明智和合理,根本不需要使用<stdarg.h>
。它也可以根据用户输入等产生不同的答案。使用变量参数的代码或多或少地使用固定长度的参数列表卡住(尽管你可以有不同的变量提供值(first_duplicate(a, b, c, d, e, f, g, '\0');
)如果你想要的话到)。