问题描述
|
我的第一个实现想法是简单地做:
bool hasUpperCase (string str) {
if(string.IsNullOrEmpty(str))
return false;
for (int i = 0; i < str.Length; i++) {
if (char.IsUpper (str[i]))
return true;
}
return false;
}
但是也许还有另一种更快的方法呢?
解决方法
你可以减少到
bool HasUpperCase (string str) {
return !string.IsNullOrEmpty(str) && str.Any(c => char.IsUpper(c));
}
使用LINQ。
, 从这里作弊:
bool hasUpperCase (string str) {
if(string.IsNullOrEmpty(str))
return false;
return str != str.ToLower();
}
, 好的-是时候为新的真理了!
这是对字符串中任何大写字符的测试。
保证该字符串在前60K个字符内没有任何大写字符。
(我从random.org创建了字符串)
我通过随机分配哪个64K字符串传递给测试函数来防止编译器中的字符串替换优化。
所有计时都严格地围绕实际测试进行,并且不包括函数调用时间。
我对测试进行了一次,十次和一万次的测试,并平均了每个测试的每组计时。
我在i3-2100 CPU @ 3.1 Ghz的64位Win 7上进行了测试
测试案例1:
static bool testCaseOne(string str,out double ms)
{
bool result = false;
DateTime start = DateTime.Now;
result = !string.IsNullOrEmpty(str) && str.Any(c => char.IsUpper(c));
ms = (DateTime.Now - start).TotalMilliseconds;
return result;
}
产生的平均时间:
1 X = 3.000毫秒
10 x = 0.860毫秒
10,000 x = 0.821毫秒
测试案例2:
static bool testCaseTwo(string str,out double ms)
{
bool result = false;
DateTime start = DateTime.Now;
if (string.IsNullOrEmpty(str))
{
ms = 0;
return false;
}
result = Regex.IsMatch(str,\"[A-Z]\");
ms = (DateTime.Now - start).TotalMilliseconds;
return result;
}
产生的平均时间:
1 x = 2.000毫秒
10 x = 1.597毫秒
10,000 x = 1.603毫秒
测试案例3:
static bool testCaseThree(string str,out double ms)
{
bool result = false;
DateTime start = DateTime.Now;
if (string.IsNullOrEmpty(str))
{
ms = 0;
return false;
}
for (int i = 0; i < str.Length; i++)
{
if (char.IsUpper(str[i]))
{
result = true;
break;
}
}
ms = (DateTime.Now - start).TotalMilliseconds;
return result;
}
产生的平均时间:
1 x = 1.000毫秒
10 x = 0.357毫秒
10,000 x = 0.298毫秒
测试案例4:
static bool testCaseFour(string str,out double ms)
{
bool result = false;
DateTime start = DateTime.Now;
if (string.IsNullOrEmpty(str))
{
ms = 0;
return false;
}
for (int i = 0; i < str.Length; i++)
{
if (str[i] > 64 && str[i] < 91)
{
result = true;
break;
}
}
ms = (DateTime.Now - start).TotalMilliseconds;
return result;
}
}
产生的平均时间:
1 x = 0.000毫秒
10 x = 0.137毫秒
10,000 x = 0.184毫秒
有趣。
我希望这能使R. K.先生满意;)
, bool hasUpperCase(string str) {
if (string.IsNullOrEmpty(str))
return false;
return Regex.IsMatch(str,\"[A-Z]\");
}
免责声明:我不是Regex专家,但我使用字符串Testing,testinG,and tesTing,
进行了测试,所有字符串均评估为true。但是,它也可以用字符串ѭ9evaluated评估为true,您可能想要也可能不想要。
, 代码对我来说看起来不错,因为您需要提高性能,所以可以通过从反面添加条件检查来将for循环从O(n)减少到O(n / 2 +〜1)。
否则,您可以检查两个后续元素,并将i递增2。显然,您应该为第二个参数检查i bool hasUpperCase (string str) { if(string.IsNullOrEmpty(str)) return false; for (int i = 0; i < str.Length; i= i + 2) { if (char.IsUpper (str[i])) return true; if ((i + 1) < str.Length && char.IsUpper (str[i+1])) return true; } return false;} 恕我直言,该技巧可能有助于回答算法面试,并没有太大的性能。 ,
public static string Upper_To_Lower(string text)
{
if (Char.IsUpper(text[0]) == true) { text = text.Replace(text[0],char.ToLower(text[0])); return text; }
return text;
}
public static string Lower_To_Upper(string text)
{
if (Char.IsLower(text[0]) == true) { text = text.Replace(text[0],char.ToUpper(text[0])); return text; }
return text;
}
在这里,我提出了2个简单的方法,它们检查任何字符串的首字母并将其从Upper转换为Lower并转换为verca ....希望对您有所帮助。