有这样一个题目
字符串(实现字符串比较函数) 输入两个字符串,然后不区分大小写进行比较,输出比较结果;
要求实现一个字符串比较函数,不区分大小写进行比较,如果第一个字符串大输出1,相等输出0,小于输出-1。
比如:
输入 HELLO hello 输出为0
输入 hello hello 输出为0
输入 Hello hEllo 输出为0
输入 hello gello 输出为1
输入 hello jello 输出为-1
在看到这个题目的时候,我们通常的想法是分情况讨论,如果两个字符串的长度一样,那么我们按照顺序比较即可不用担心越界的问题,但是这里会出现冗余代码的问题
static int MyCompare2(string str, string str2)
{
//字符串str的长度大于str2的长度
if (str.Length > str2.Length)
{
//取比较短的字符串作为比较对象 不用担心越界的问题
for (int i = 0; i < str2.Length; i++)
{
//下面的比较代码就是和else if中的代码就构成了冗余的代码
if (str[i] > str2[i])
{
return 1;
}
else if (str[i] < str2[i])
{
return -1;
}
}
return 1;
}
//字符串str的长度小于str2的长度
else if (str.Length < str2.Length)
{
//取比较短的字符串作为比较对象 不用担心越界的问题
for (int i = 0; i < str.Length; i++)
{
if (str[i] > str2[i])
{
return 1;
}
else if (str[i] < str2[i])
{
return -1;
}
}
return -1;
}
//剩下的就是相等的情况了,直接返回0
return 0;
}
我们要把冗余代码去掉
改进方法后的代码如下
static int MyCompare2(string str, string str2)
{
//我们取第一个字符串为比较对象 假如str的字符串比较短,那么在i++过后i编程str.Length的时候将会跳出循环
for (int i = 0; i < str.Length; i++)
{
//如果str的长度比较短,那么在i++过后i编程str2.Length的时候将会执行break跳出循环
if (i > str2.Length-1)
{
break;
}
if (str[i] > str2[i])
{
return 1;
}
else if (str[i] < str2[i])
{
return -1;
}
}
//这时候我们来判断字符串的长短就可以得到
//首先我们来看返回值的特征 -1 0 1 绝对值是相对0对称的,那么我们可以考虑结合绝对值思考问题
//因为去取-1还是取1是取决于str.Length - str2.Length还是str2.Length - str1.Length,如果str.Length > str2.Length那么(str.Length - str2.Length) / Math.Abs(Math.Abs(str.Length - str2.Length))就是1 ;如果str.Length < str2.Length那么(str.Length - str2.Length) / Math.Abs(Math.Abs(str.Length - str2.Length))就是-1;否则就是0;
return Math.Abs(str.Length - str2.Length) == 0 ? 0 : (str.Length - str2.Length) / Math.Abs(Math.Abs(str.Length - str2.Length));
}
优化
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 字符串比较
{
class Program
{
static void Main(string[] args)
{
//Console.WriteLine(Task02("hf", "helloworld"));
int ret = MyCompare("1234", "123");
Console.WriteLine(ret);
}
static bool Task01(string str1,string str2)
{
if (str1 == str2)
{
return true;
}
return false;
}
static int Task02(string str1, string str2)
{
//字符串在比较的时候相同索引的字符相互比较
//如果字符串长度相等 所有的对应索引的字符也一样那么返回0 例如"bjd" 和 "bjd" 比较返回0
//如果字符串长度不相等 具有相同索引值的字符比较,如果发现第一个字符串中的某个字符比第二个字符串相同索引的字符的ASCII大值返回1 否则如果小就返回-1 否则继续比较下一个 如果比较到两者中长度比较短的字符串末尾还没有分出大小 那么长度小字符串比较小
return string.Compare(str1,str2);
}
static int MyCompare(string str1,string str2)
{
// abc abc
for (int i = 0; i < str1.Length; i++)
{
//如果str1比str2长的情况
if (i>str2.Length-1)
{
return 1;
}
if (str1[i] > str2[i])
{
return 1;
}
else if (str1[i]<str2[i])
{
return -1;
}
}
//str1的长度小于或等于str2的长度
return str1.Length == str2.Length ? 0 : -1;
}
}
}