1 字符判重 isUniqueChar(string str)
要求:输入字符串,判断该串是否不含有重复字符
需要确认问题:encoding是UTF-8还是ASCII码?
思路:使用hashtable记录字符出现情况;如果已经存在,就说明有重复;
如果是ASCII,使用256位数组即可;
UTF8(万国码)编码的解释:http://baike.baidu.com/item/UTF-8/481798?fromtitle=UTF8&fromid=772139&fr=aladdin
public static bool IsUniqueChar(string str)
{
if (string.IsNullOrEmpty(str))
return true;
Dictionary<int,bool> charSet = new Dictionary<int,bool>();
char[] charArr = str.ToCharArray();
for (int i = 0; i < charArr.Length; i++)
{
int tmpInt = (int)charArr[i];
if (charSet.ContainsKey(tmpInt)&&charSet[tmpInt] == true)
return false;
charSet.Add(tmpInt,true);
}
return true;
}
-----------------------------------------------------------------------------------------------------------------
2 产生括号|| Generate Parentheses
要求:产生所有N对合理的括号组合;
举例:
N=3时,输出: ()()(), ()(()),(())(),((()))
思路:递归产生合理括号;
1 需要使用3各变量:当前位置;左括号剩余量;右括号剩余量;
2 边界条件:左括号剩余量<0, 右括号剩余量<1; 不合法括号->return
3 如果没有左右括号可以使用->把当前结果作为合理括号组合打出;
4 如果左括号还有剩余->当前位置插入左括号,递归调用函数填充下一个位置;
5 如果右括号剩余量大于左括号 -> 当前位置插入右括号,递归调用填充函数下一个位置;
注意事项:每次递归完成后会进入下一级的
public static List<string> GenerateParentheis(int n)
{
List<string> result = new List<string>();
if (n <= 0)
return result;
Helper(n, n, string.Empty, result);
return result;
}
/// <summary>
/// 递归,不断充实result
/// </summary>
/// <param name="left">左括号个数</param>
/// <param name="right">右括号个数</param>
/// <param name="curPair">当前括号pair</param>
/// <param name="result">最终result</param>
private static void Helper(int left, int right, string curPair, List<string> result)
{
if (left == 0 && right == 0)//凑成1个pair了
{
result.Add(curPair);
return;
}
if (left > 0)//左括号剩余
{
Helper(left - 1, right, curPair + "(", result);
}
if (right > 0&& left<right)//右括号剩余
{
Helper(left, right - 1, curPair + ")", result);
}
}
----------------------------------------------------------
3 字符串转十进制数
实现atoi函数,字符串转为十进制整数
需要确认的问题:
1 字符串可以是任意字符么?如果是,怎么办?
答:是,忽略非数字字符;
2 int长度是32?答:
是
考点:
1 判断正负数
2 判断是否溢出
3 核心数学思路: x=x*10 + x.nextChar - '0'; (x为指针当前指向的char)
public static int Atoi(string str)
{
if (string.IsNullOrEmpty(str) || str.Length == 0)
return 0;
bool isNeg = false;
//清除空格
str = str.Trim();
char[] charArr = str.ToCharArray();
int pos = 0;
// 预处理符号位
if (charArr[pos] == '-')
{
isNeg = true;
pos++;
}
if (charArr[pos] == '+')
{
isNeg = false;
pos++;
}
//字符串转换为整数
char c;
Int64 num = 0;
while (pos < charArr.Length)
{
c = charArr[pos];
if (char.IsDigit(c))
{
//处理前后都需要进行溢出验证;
if (num > Int32.MaxValue || num < Int32.MinValue)
return (isNeg) ? Int32.MinValue : Int32.MaxValue;
num = num * 10 + c - '0';
if (num > Int32.MaxValue || num < Int32.MinValue)
return (isNeg) ? Int32.MinValue : Int32.MaxValue;
}
pos++;
}
return (isNeg) ? -(int)num : (int)num;
}
5 正则匹配(难度:hard)
要求:实现函数 IsMatch(string s, string p); s为字符串,p为匹配模式。该函数支持'.'和'*'正则匹配,
'.'表示单个字符,
'*'表示0或多个前一个字符
举例:
isMatch("a","a")->true
isMatch("aa","a")->false
isMatch("a","aa")->false
isMatch("aa","a*")->true
isMatch("ab",".*")->true
isMatch("ab","abc")->true
思路: 双指针si, pi记录当前匹配位置。
代码: 《进军硅谷》p163