数据结构基础训练
前言
利用数组和字符串进行简单的数据结构练习,以leetcode程序题为对象,以C#作为开发语言,从而总结两者的异同。
一、数组
搜索插入位置
(1)题目分析
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
(2)设计思想
若目标在数组中,直接返回下标,若不在,则先将其插入,从小到大排序后返回该元素的下标。
(3)核心代码
public static int SearchInsert(int[] nums, int target)
{
int temp,y,min,x=0;
int[] nums1= new int[nums.Length+1];
for(int i=0;i<nums.Length;i++)
{
nums1[i] = nums[i];
if(target==nums[i])
{
return i;
}
}
nums1[nums.Length] = target;
for (int i = 0; i < nums1.Length; i++)
{
min = nums1[i];
y = i;
for (int j = i + 1; j < nums1.Length; j++)
{
if (nums1[j] < min)
{
min = nums1[j];
y = j;
}
}
temp = nums1[y];
nums1[y] = nums1[i];
nums1[i] = temp;
}
for (int i = 0; i < nums1.Length; i++)
{
if (nums1[i] == target)
{
x = i;
break;
}
}
return x;
}
(4)性能分析
二、二维数组
零矩阵
(1)题目分析
若M × N矩阵中某个元素为0,则将其所在的行与列清零。
(2)设计思想
先确定矩阵中元素为0的位置,再遍历进行置零。
(3)核心代码
public static void SetZeros(int[][] matrix)
{
int n, m;
n = matrix.Length; //行数
m = matrix[0].Length; //列数
int[] a = new int[m];
int[] b = new int[n];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (matrix[i][j] == 0)
{
a[i] = 1;
b[j] = 1;
}
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if(a[i]==1 || b[j]==1)
{
matrix[i][j] = 0;
}
}
}
}
(4)性能分析
三、字符串
翻转字符串里的单词
(1)题目分析
翻转后的字符串首尾不含空格,每个单词之间只允许一个空格,单词内的字符顺序不变。
(2)设计思想
对原字符串进行预处理,保证首尾无空格,单词间只有一个空格;保存处理后的字符串,再以单词为整体倒序输出。
(3)核心代码
public class Solution
{
static void Main(string[] args)
{
string str = "the sky is blue";
string s=ReverseWords(str);
Console.WriteLine(s);
}
public static string ReverseWords(string s)
{
string x = "", m = "";
string[] y;
for (int i = 0; i < s.Length - 1; i++)
{
if (s[i] != ' ')
{
x += s[i];
if (s[i + 1] == ' ' && i != s.Length - 2)
{
x += " ";
}
}
}
if (s[^1] != ' ')
{
x += s[^1];
}
x = x.Trim();
y = x.Split();
for (int j = 0; j < y.Length; j++)
{
m += y[y.Length - 1 - j];
if (j != y.Length - 1)
{
m += " ";
}
}
return m;
}
(4)性能分析
心得体会
1.数组可以修改,字符串不能修改。进行删除,也只能删除整个字符串。
2.二维数组的数组元素为数组,访问和普通数组类似。数组,字符串均可以用索引进行访问,都有.Length属性,操作符也有很多相同的。
3.数组可以动态分配内存空间,二维数组可以进行矩阵操作。
4.在性能分析上,程序占用内存比较少,若减少循环的次数,可以极大程度优化时间复杂度。对于程序细节,可以通过多次测试修改确定。