Leetcode做题记录----1
125、验证回文串
思路:
1.移除非数字和字母字符
2.全部转为小写字符
3.前后同时开始判断
双指针问题
public class Solution
{
public bool IsPalindrome(string s)
{
//构造一个临时字符串数组 用于辅助记录 将原字符串清理后用于判断回文串
List<char> help = new List<char>();
foreach (char c in s)
{
//IsLetterOrDigit()该函数是用于判断该字符是否是字符或者数字
//你也可以通过ASCII值进行判断
// c >='a' || c<='z' c>='0' ||c<='9'
if (char.IsLetterOrDigit(c))
{
//ToUpper()该函数用于将小写字母转为大写
help.Add(char.ToUpper(c));
}
}
int left = 0;
int right = help.Count - 1;
//这里就是左边和右边开始判断
//有一个部分不同 就直接返回false
//或者等到左指针等于右指针 结束循环
while (left <= right)
{
if (help[left] != help[right])
{
return false;
}
left++;
right--;
}
return true;
}
}
128、最长连续序列
思路:
1.利用哈希集合的唯一性,进行数字序列的计算。
2.如果一个数的上一个数是自己刚好的上一个数,例如:1是2的前一个数,那么从2开始肯定就不是最长的序列,即目标:寻找到自己的上一个数不在哈希表中存在时,从此时开始进行序列长度的计数,那什么时候增加呢,即自己的下一个数刚好是下一个数,那么序列长度++。记录下这个结果,即最终的答案。
public class Solution
{
public int LongestConsecutive(int[] nums)
{
if (nums == null ||nums.Length == 0 )
{
return 0;
}
int maxList = 0;
//创建一个哈希集合 将左右的数组元素放进去
HashSet<int> set = new HashSet<int>();
for (int i = 0; i < nums.Length; i++)
{
set.Add(nums[i]);
}
//利用迭代器遍历集合元素
foreach (int number in set)
{
//如果一个数的上一位数也存在 那他肯定就不是一段数字序列的起点 直接跳过该数
//直到找到一个上一位数不存在的情况
if (!set.Contains(number - 1))
{
//将当前位置的数字存下来
//记录现在维护的序列长度 开始肯定为1
int currentNumber = number;
int currentList = 1;
//这里就是继续判断当前的下一位数字是否存在
//注意:最好不要改原始元素(因为外面在使用) 改我们拿出来的currentNumber
//进入循环说明长度就会加一
//然后往下走 直到哈希集合中不存在这个元素
while (set.Contains(currentNumber + 1))
{
currentNumber++;
currentList++;
}
//比较那个最大 最后返回得出结果
maxList = Math.Max(maxList, currentList);
}
}
return maxList;
}
}
13、罗马数字转整数
思路:
1.建立每个罗马字符和整数之间的映射关系,可以通过字典,也可以通过哈希表。
2.遍历整个字符串,然后计算每个符号的累加;
3.注意:减法时,三个特殊的字符要特别在意,当他们出现在左边时候,即做减法时候。左边的值比右边的值小,那么此时就是在最后的结果上做减法,加法就直接加。
public class Solution
{
public int RomanToInt(string s)
{
int res = 0;
//建立映射关系 罗马数字和整数映射
Dictionary<char, int> romanValues = new Dictionary<char, int>
{
{'I',1 },
{'V',5 },
{'X',10},
{ 'L',50},
{ 'C',100},
{'D',500 },
{'M' ,1000}
};
//对整个字符串进行遍历
for (int i = 0; i < s.Length; i++)
{
//如果当前的字符比下一个字符代表的整数小 说明是在最后的结果上做减法
//为了保证不越界 i是不能到达最后一个的 因为你有i+1的使用
//i+1的位置上实际也是判断了的
if (i < s.Length - 1 && romanValues[s[i]] < romanValues[s[i + 1]])
{
res -= romanValues[s[i]];
}
//加法比减法多很多种情况 除了减法 那么剩下全是加法
//直接加对应值就行
else
{
res += romanValues[s[i]];
}
}
return res;
}
}
1720、解码异或后的数组
思路:
1、利用异或的特点 a^b=c =>a^c =b;
2、仔细读题 创造一个新的数组存放结果 最后返回即可
public class Solution
{
public int[] Decode(int[] encoded, int first)
{
//定义一个新的数组用于存放结果
//异或的知识点:
//相同为0 相异为一 0^N = N
//异或的特点
//即 a = b ^ c => a ^ c = b;
int[] decode = new int[encoded.Length + 1];
decode[0] = first;
for (int i = 0; i < encoded.Length; i--)
{
decode[i + 1] = decode[i] ^ encoded[i];
}
return decode;
}
}
14、最长公共前缀
思路:
1.将第一个字符串作为基准,然后后面的每个字符串分别从第一个字符串的第一个字符开始进行比较,如果有一个字符串上的字符不同,直接返回该位置以前的子字符串。
2.构建两层循环,一层用于拿每个字符串,一层用来比较每个位置的字符
3.记得加个判空处理,即如果输入的是空或者输入的字符串数组长度为0直接返回一个空即“”,C#中有一个函数,可以直接调用,在string下面。
public class Solution
{
public string LongestCommonPrefix(string[] strs)
{
//判空处理
if (strs.Length == 0 || strs == null)
{
return "";
}
//抓一个基准 即字符串数组的第一个
string first = strs[0];
//开始遍历和第一个字符串上相同位置的字符情况
for (int i = 0; i < first.Length; i++)
{
//每次更新位置上的字符
//i是指单个字符串上的位置
char c = first[i];
for (int j = 1; j < strs.Length; j++)
{
//j是指第几个字符串
//每个字符串的长短不一 所以进行数组索引的判断必须有
if (i >= strs[j].Length || c != strs[j][i])
{
return first.Substring(0, i);
}
}
}
return first;
}
}