C#的数组与字符串
一.数组
1.声明
- 语法
datatype[] arrayName=new int[4]
string[] name=new string[count]
声明数组时,方括号 ([]) 必须跟在类型后面,而不是标识符后面。在 C# 中,将方括号放在标识符后是不合法的语法。
2.初始化
另一细节是,数组的大小不是其类型的一部分,而在 C 语言中它却是数组类型的一部分。这使您可以声明一个数组并向它分配 int 对象的任意数组,而不管数组长度如何。
1.int[] data={20,00,10,15};
2.int[] data; data=new int[4];
3int[] data; data=new int[5]{20,00,10,15}
注意: 元素个数要与定义的长度一致。如果在声明时没有初始化数组,则数组成员将自动初始化为该数组类型的默认初始值。另外,如果将数组声明为某类型的字段,则当实例化该类型时它将被设置为默认值 null。
3.不规则数组声明
- 语法形式: tyoe[][][]arrayName; 方括号[]的个数与数组的维数有关。
例如:int[][]jagged
- 创建数组对象
以二维不规则数组为例:
4.访问数组成员
- 访问数组成员可以直接进行,类似于在 C/C++ 中访问数组成员。
int[] numbers = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
numbers[4] = 5;
下面的代码声明一个多维数组,并向位于 [1, 1] 的成员赋以 5:
int[,] numbers = { {1, 2}, {3, 4}, {5, 6}, {7, 8}, {9, 10} };
numbers[1, 1] = 5;
5.对数组使用 foreach
- 该语句提供一种简单、明了的方法来循环访问数组的元素。foreach中的in表示我们要遍历哪个数组,i表示我们要访问的各个数组元素,其类型根据数组类型而定(比如此处是int),但foreach不知道数组元素的索引。
int[] numbers = {4, 5, 6, 1, 2, 3, -2, -1, 0};
foreach (int i in numbers){System.Console.WriteLine(i);}
有点类似于for循环的功能。 对于多维数组,可以使用相同方法来循环访问元素。
int[] numbers = new int[3, 2] {{9, 99}, {3, 33}, {5, 55}};
foreach(int i in numbers){Console.Write("{0} ", i);}
注意 由于有了多维数组,使用嵌套 for 循环可以更好地控制数组元素。
二.字符串
1.字符串的性质
- 字符串的不可变性:字符串是一个常量。
- 字符串的拘留池机制: 当一个字符串已经被创建,那么以后每次创建相同值的字符串时会直接引用它的地址值,无需为自己的值开辟新的内存空间。
2.字符串的处理
字符串可以当作字符char类型的数组
- 以下函数均对原字符串无影响,但是需要另一个string类型变量接受。
| 函数|实现的功能 |
| --- | --- |
| name.Length | 访问字符串长度 |
| name.ToLower|转换成小写并返回 |
| name.ToUpper | 转换成大写并返回 |
| name.Trim() | 去掉字符串前面和后面的空格 |
| name.TrimStart() | 去掉字符串前面的空格 |
| name.TrimEnd() | 去掉字符串后面的空格 |
| name.Split() | 原字符串按照指定的字符进行拆分,得到一个拆分后的字符串数组,指定的字符放在单引号里面。 |
| name.IndexOf()|查找某个字符在字符串中的位置 | |name.SubString() | 从字符串中截取子字符串|
注意:Split访问的是字符串数组,要用字符串数组接收(不能用string类型变量)
例如:
string str = "my-mind-will-be-concentrated";
string[] str2 = str.Split('-');
Console.WriteLine(str + ".");
foreach(string temp in str2)
{
Console.WriteLine(temp);
}
3.字符串的Format()方法
- 语法
string myString = string.Format("格式字符串", 参数列表); - 例如:
string myString = string.Format ("{0} 乘以 {1} 等于 {2} ", 2, 3, 2*3);
三.学习心得
学习完后,感觉到无论是C,C++,还是python语法等等都有很多相同之处,学起来更容易一些。c#中的诸多函数能很好的简化代码,能节省空间,但是语法要求比较严格,需要较高的熟练度。学习过程中,看到了很多大佬的解释,与提醒的一些细节,有点大开眼界的感觉了。越发感觉自己还需要多练,多努力。
LeetCode代码训练
1.寻找数组的中心索引
给你一个整数数组 nums,请编写一个能够返回数组 “中心下标” 的方法。
数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。
如果数组不存在中心下标,返回 -1 。如果数组有多个中心下标,应该返回最靠近左边的那一个。
注意:中心下标可能出现在数组的两端。
public class Solution
{
public int PivotIndex(int[] nums)
{
int sum = 0;
int leftsum = 0;
foreach (int Value in nums)
{
sum += Value;
}
for (int i = 0; i < nums.Length; i++)
{
if (leftsum*2==sum-nums[i])
return i;
leftsum += nums[i];
}
return -1;
}
}
2.搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 你可以假设数组中无重复元素。
public class Solution
{
public int SearchInsert(int[] nums, int target)
{
for (int i = 0; i < nums.Length; i++)
{
if (nums[i] > target || nums[i] == target)
{
return i;
}
else if (target > nums[nums.Length - 1]) return nums.Length;
}
return 0;
}
}
3.零矩阵
编写一种算法,若M × N矩阵中某个元素为0,则将其所在的行与列清零。
public class Solution {
public void SetZeroes(int[][] matrix)
{
bool[] row = new bool[matrix.Length];
bool[] column = new bool[matrix[0].Length];
for (int i = 0; i < matrix.Length; i++)
{
for (int j = 0; j < matrix[0].Length; j++)
{
if (matrix[i][j] == 0)
{
row[i] = true;
column[j] = true;
}
}
}
for (int i = 0; i < matrix.Length; i++)
{
for (int j = 0; j < matrix[0].Length; j++)
{
if (row[i] || column[j])
{
matrix[i][j] = 0;
}
}
}
}
}