欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据结构与算法(C#)入门 --- 串和数组

程序员文章站 2024-03-23 09:44:34
...

前言

本章内容包含串与数组,都是平时工作中常用的内容。因此串与数组的介绍会很简单,重点在于 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;