前言
本章内容包含串与数组,都是平时工作中常用的内容。因此串与数组的介绍会很简单,重点在于 LeetCode 的练习。
串的定义
在应用程序中使用最频繁的类型是字符串。字符串简称串。
串的存储
由于串中的字符都是连续存储的,而在 C#中串具有恒定不变的特性,即字符串一经创建,就不能将其变长、变短或者改变其中任何的字符。
数组
数组是一种常用的数据结构,可以看作是线性表的推广。数组作为一种数据结构,其特点是结构中的数据元素可以是具有某种结构的数据。
比如二维数组的元素就是一维数组。
数组的存储
在内存中开辟一块连续的、大小相同的空间,用来存储数据。通常采用顺序存储结构来存储数组中的数据元素。
练习题1-Robot Return to Origin
需求:有一个机器人初始位置是 (0,0),根据字符串 S 移动。S 只包含 L(左移)R(右移)U(上移)D(下移)。假设每次移动的长度相同,判断机器人执行完S后是否能够回到初始位置。
思路:假设执行 L 时 +1,R 时 - 1. U 时 + 1,D 时 - 1。只要判断机器人在水平方向 LR,垂直方向上 UD 和是否为0.
关键代码:
var vertiVal = 0;
var horizVal = 0;
foreach (var c in moves)
{
if (c == 'U' || c == 'D')
{
vertiVal = c == 'U' ? ++vertiVal : --vertiVal;
}
else if (c == 'L' || c == 'R')
{
horizVal = c == 'L' ? ++horizVal : --horizVal;
}
}
return (vertiVal == 0 && horizVal == 0);
练习题2-Reverse String
需求:字符串 S 反转。不能创建额外的数组,只能对 S 进行修改。
思路:创建临时变量 tmp,然后 i 处与 S.Length - 1 - i 处值交换
关键代码:
if (null == s || s.Length == 0)
{
return;
}
int end = s.Length - 1;
for (int i = 0; i < end; i++, end--)
{
var tmp = s[i];
s[i] = s[end];
s[end] = tmp;
}
练习题3-Reverse String
需求: 数组重新排序,偶数在前(顺序随意),奇数在后(顺序随意)。
思路:
设置两个节点: first 与 end . first 是从头到尾, end 是从尾到头.假设数组是 A
如果 A[first] 是偶数, 说明不需要改变, 此时 first++
如果 A[end]是奇数,说明不需要改变, 此时 end--
关键代码:
var end = A.Length - 1;
for (int i = 0; i < end; i++)
{
if (A[i] % 2 == 0)
{
continue;
}
else if (A[i] % 2 == 1)
{
while (A[end] % 2 == 1 && end > i)
{
end--;
}
var tmp = A[i];
A[i] = A[end];
A[end] = tmp;
end--;
}
}
return A;