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

Posted huang1991

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构与算法(C#)入门 --- 串和数组相关的知识,希望对你有一定的参考价值。

前言

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

以上是关于数据结构与算法(C#)入门 --- 串和数组的主要内容,如果未能解决你的问题,请参考以下文章

第四章 串和数组 (主要kmp算法)

408数据结构与算法—串和BF算法(二十四)

408数据结构与算法—串和BF算法(二十四)

总结:串和数组的学习

考研数据结构与算法字符串

第四章心得体会