练习 1: 数组元素求和
题目 : 编写一个C#程序,计算数组中所有元素的总和。
namespace Djproject { internal class ArraySum { public static int SumArray(int[] arr) { int sum = 0; // 初始化总和为0 foreach (int num in arr) // 遍历数组中的每个元素 { sum += num; // 将当前元素的值加到总和上 } return sum; // 返回总和 } public static void Main() { int[] numbers = { 1, 2, 3, 4, 5 }; Console.WriteLine(SumArray(numbers)); // 应输出 15 } } }
ArraySum.Main();
结果:
练习2: 数组元素乘积
题目 : 编写一个C#程序,计算数组中所有元素的乘积。
namespace Djproject { internal class ArrayProduct { public static long ProductArray(int[] arr) { int product = 1; // 初始化总和为1 foreach (int num in arr) // 遍历数组中的每个元素 { product *= num; // 将当前元素的值乘到总和上 } return product; // 返回总和 } public static void Main() { int[] numbers = { 1, 2, 3, 4, 5 }; Console.WriteLine(ProductArray(numbers)); //应输出 120 } } }
ArrayProduct.Main();
结果:
练习3: 数组元素平均值
题目 : 编写一个C#程序,计算数组中所有元素的平均值
namespace Djproject { internal class ArrayAverage { public static double AverageArray(int[] arr) { int sum = 0; // 初始化总和为0 foreach (int num in arr) // 遍历数组中的每个元素 { sum += num; // 将当前元素的值加到总和上 } return sum / arr.Length; } public static void Main() { int[] numbers = { 1, 2, 3, 4, 5 }; Console.WriteLine(AverageArray(numbers)); } } }
ArrayAverage.Main();
结果:
练习4: 查找数组中的最大值
题目 : 编写一个C#程序,找到数组中的最大值。
namespace Djproject { internal class ArrayMax { public static int MaxValue(int[] arr) { int max = 0; foreach (int i in arr) { if (i > max) { max = i; } } return max; } public static void Main() { int[] numbers = { 1, 2, 3, 4, 5 }; Console.WriteLine(MaxValue(numbers)); } } }
ArrayMax.Main();
结果:
练习 5: 查找数组中的偶数
题目 : 编写一个C#程序,从数组中筛选出所有的偶数,并返回一个新的数组。
namespace Djproject { internal class EvenNumbers { public static List<int> GetEvens(int[] arr) { List<int> NewList = new List<int>(); foreach (int i in arr) { if (i % 2 == 0) { NewList.Add(i); } } return NewList; } public static void Main() { int[] numbers = { 1, 2, 3, 4, 5, 6 }; List<int> evenNumbers = GetEvens(numbers); foreach (int num in evenNumbers) { Console.Write(num + " "); } } } }
结果:
练习6: 计算阶乘
题目 : 编写一个C#函数,计算给定非负整数的阶乘。
namespace Djproject { internal class Factorial { public static long CalculateFactorial(int number) { long factorial = 1; for (int i = 1; i <= number; i++) { factorial *= i; } return factorial; } public static void Main() { Console.WriteLine(CalculateFactorial(5)); } } }
结果:
练习7: 数组翻转
题目 : 编写一个C#程序,将一个整数数组翻转。
Array.Reverse(arr)
这个方法接受一个数组作为参数,并就地翻转该数组的元素顺序,而不需要创建新数组或返回任何值(因为它是void
类型的)。namespace Djproject { internal class ArrayReverse { public static void ReverseArray(int[] arr) { Array.Reverse(arr); } public static void Main() { int[] array = { 1, 2, 3, 4, 5 }; ReverseArray(array); foreach (int i in array) { Console.Write(i + " "); } } } }
结果:
练习8: 字符串反转
题目 : 编写一个C#函数,反转一个字符串。
namespace Djproject { internal class StringReversal { public static string ReverseString(string str) { char[] charArray = str.ToCharArray(); // 将字符串转换为字符数组 Array.Reverse(charArray); // 使用Array.Reverse反转数组 return new string(charArray); // 将反转后的字符数组转换回字符串并返回 } public static void Main() { Console.WriteLine(ReverseString("hello")); } } }
结果:
练习9: 检查回文
题目 : 编写一个C#函数,检查一个字符串是否是回文。
string cleanStr = new string(str.Where(char.IsLetterOrDigit).ToArray()).ToLower();
string cleanStr =
:定义了一个新的字符串变量cleanedStr
,这个变量将会存储清洗后的字符串。
new string(str.Where(char.IsLetterOrDigit).ToArray())
:
str
是原始的字符串变量。
Where(char.IsLetterOrDigit)
是 LINQ 查询,它遍历字符串str
中的每个字符,并使用char.IsLetterOrDigit
方法判断每个字符是否是字母或数字。这个方法返回一个布尔值true
或false
,Where
方法根据这个布尔值选择字符。
ToArray()
将筛选出的字符转换为一个字符数组。
new string(...)
构造函数,它接受一个字符数组并创建一个新的字符串,这个新字符串只包含原始字符串中的字母和数字字符。
ToLower()
:将新字符串中的所有字符转换为小写。在英语中,这意味着大写字母会被转换成小写字母。namespace Djproject { internal class PalindromeChecker { public static bool IsPalindrome(string str) { // 首先,去除字符串中的所有非字母数字字符,并将所有字符转换为小写(或大写) // 以确保比较时忽略大小写和非字母数字字符 string cleanStr = new string(str.Where(char.IsLetterOrDigit).ToArray()).ToLower(); // 使用两个索引,一个从字符串的开头开始,另一个从末尾开始 int left = 0; int right = cleanStr.Length - 1; // 当左索引小于右索引时,比较字符 while (left < right) { // 如果字符不匹配,则字符串不是回文 ,返回false if (cleanStr[left] != cleanStr[right]) { return false; } left++; right--; } return true; } public static void Main() { Console.WriteLine(IsPalindrome("racecar")); } } }
结果:
练习 1Θ : 数组中的最大值和最小值
题目 : 编写一个C#函数,找出数组中的最大值和最小值。
namespace Djproject { internal class MaxMinFinder { public static Tuple<int, int> FindMaxMin(int[] arr) { int max = arr[0]; int min = arr[0]; for (int i = 1; i < arr.Length; i++) { if (arr[i] > max) { max = arr[i]; } if (arr[i] < min) { min = arr[i]; } } return Tuple.Create(max, min); } public static void Main() { int[] array = { 3, 7, 1, 9, 2 }; var result = FindMaxMin(array); Console.WriteLine($"Max : {result.Item1} , Min : {result.Item2}"); } } }
结果:
练习 11: 素数检查器
题目 : 编写一个C#函数,用于判断一个数字是否为素数。
namespace Djproject { internal class PrimeChecker { public static bool IsPrime(int number) { // 小于2的数不是素数 if (number < 2) { return false; } // 检查从2到number的平方根之间的所有数 for (int i = 2; i*i <= number; i++) { if(number % i == 0) { return false; } } // 如果没有找到能整除的数,则number是素数 return true; } public static void Main() { Console.WriteLine(IsPrime(17)); } } }
结果:
练习 12: 字符串中的最长无重复子串
题目 : 找到一个字符串中的最长无重复字符的子串长度。
namespace Djproject { internal class LongestUniqueSubstring { public static int LengthOfLongestSubstring(string str) { if (string.IsNullOrEmpty(str)) return 0; int maxLength = 0; int left = 0; Dictionary<char, int> charIndexMap = new Dictionary<char, int>(); for (int right = 0; right < str.Length; right++) { char c = str[right]; // 如果字符已经存在于窗口中,则移动左边界到该字符上一次出现位置的下一个位置 if (charIndexMap.ContainsKey(c) && charIndexMap[c] >= left) { left = charIndexMap[c] + 1; } // 更新字符最后出现的位置 charIndexMap[c] = right; // 计算当前窗口的长度,并更新最大长度 maxLength = Math.Max(maxLength, right - left + 1); } return maxLength; } public static void Main() { Console.WriteLine(LengthOfLongestSubstring("abcabcbb")); } } }
结果:
练习 13: 数字到字符串转换
题目 : 编写一个函数,将一个整数转换为其英文描述。
namespace Djproject { internal class NumberToWords { public static string ConvertNumberToWords(int number) { string[] ones = { "", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine" }; string[] tens = { "", "", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety" }; string[] teens = { "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen" }; if (number == 0) return "Zero"; if (number < 0) return "Negative " + ConvertNumberToWords(-number); if (number < 10) return ones[number]; if (number < 20) return teens[number - 10]; if (number < 100) return tens[number / 10] + (number % 10 > 0 ? " " + ones[number % 10] : ""); if (number < 1000) return ConvertNumberToWords(number / 100) + " Hundred" + (number % 100 > 0 ? " " + ConvertNumberToWords(number % 100) : ""); throw new ArgumentException("Number is too large."); } public static void Main() { Console.WriteLine(ConvertNumberToWords(15)); } } }
结果:
练习 14: 简单的日期格式化
题目 : 编写一个函数,将当前日期格式化为“Day Month Year”形式。
namespace Djproject { internal class DateFormatter { public static string FormatDate() { DateTime now = DateTime.Now; return now.Day + " " + now.Month + "月" + now.Year; } public static void Main() { Console.WriteLine(FormatDate()); } } }
结果:
练习 15: 简单的计算器
题目 : 编写一个简单的计算器函数,支持加、减、乘、除四种基本运算。
namespace Djproject { internal class SimpleCalculator { public static double Calculate(double num1, char op, double num2) { switch (op) { case '+': return num1 + num2; case '-': return num1 - num2; case '*': return num1 * num2; case '/': if (num2 == 0) { //当程序尝试进行除以零的操作时抛出 throw new DivideByZeroException("除数不能为0。"); } return num1 / num2; default: //查传入的操作符是否支持。如果不支持,它就会抛出一个包含错误信息的 ArgumentException throw new ArgumentException("不支持的操作符:" + op); } } public static void Main() { Console.WriteLine(Calculate(10, '+', 5)); Console.WriteLine(Calculate(10, '-', 5)); Console.WriteLine(Calculate(10, '*', 5)); Console.WriteLine(Calculate(10, '/', 5)); } } }
结果:
练习 16: 数组中的两数之和
题目 : 给定一个整数数组 nums 和一个目标值 target ,编写一个函数找到数组中和为目标值的两个整数的索 引。假设数组中的数据和一定能满足target,不用考虑不满足的情况。
namespace Djproject { internal class TwoSum { public static Tuple<int, int> FindTwoSum(int[] nums, int target) { // 创建一个字典来存储元素和它们的索引 Dictionary<int, int> numberToIndex = new Dictionary<int, int>(); for (int i = 0; i < nums.Length; i++) { // 计算差值 int complement = target - nums[i]; // 检查差值是否已经在字典中 if (numberToIndex.ContainsKey(complement)) { // 如果在,就返回当前索引和差值对应的索引 return Tuple.Create(numberToIndex[complement], i); } // 如果差值不在字典中,将当前元素和索引添加到字典中 numberToIndex[nums[i]] = i; } throw new InvalidOperationException("找不到答案"); } public static void Main( ) { int[] nums = { 2, 7, 11, 15 }; int target = 9; var indices = FindTwoSum(nums, target); Console.WriteLine($"Indices : {indices.Item1} , {indices.Item2}"); } } }
结果:
练习 17: 字符串去重
题目 : 编写一个函数,移除字符串中的重复字符,只保留第一个出现的字符。
namespace Djproject { internal class UniqueChars { public static string RemoveDuplicates(string str) { HashSet<char> seen = new HashSet<char>(); StringBuilder result = new StringBuilder(); foreach (char c in str) { // 如果字符尚未被添加到集合中,则添加到结果字符串和集合中 if (seen.Add(c)) { result.Append(c); } } // 转换对象为字符串并返回 return result.ToString(); } public static void Main() { string input = "hello world "; Console.WriteLine(RemoveDuplicates(input)); } } }
结果:
练习 18: 滑动窗口最大值
题目 : 给定一个数组和一个窗口大小k,找到滑动窗口中的最大值。
namespace Djproject { internal class SlidingWindowMax { public static List<int> FindMaxInWindows(int[] nums, int k) { if (nums == null || nums.Length == 0 || k <= 0) { return new List<int>(); } List<int> result = new List<int>(); for (int i = 0; i < nums.Length - k; i++) { int max = 0; for (int j = i; j < i + k; j++) { if (nums[j] > max) { max = nums[j]; } } result.Add(max); } return result; } public static void Main() { int[] nums = { 1, 3, -1, -3, 5, 3, 6, 7 }; int k = 3; List<int> maxValues = FindMaxInWindows(nums, k); foreach (int max in maxValues) { Console.Write(max + " "); } } } }
结果:
练习 19: 矩阵旋转
题目 : 编写一个函数,将一个N x N的矩阵顺时针旋转90度。
namespace Djproject { internal class MatrixRotation { public static void RotateMatrix(int[,] matrix) { int n = matrix.GetLength(0); // 先进行矩阵的转置 for (int i = 0; i < n; i++) { for (int j = i; j < n; j++) { // 交换 matrix[i, j] 和 matrix[j, i] int temp = matrix[i, j]; matrix[i, j] = matrix[j, i]; matrix[j, i] = temp; } } // 然后反转每一行 for (int i = 0; i < n; i++) { for (int j = 0; j < n / 2; j++) { // 交换 matrix[i, j] 和 matrix[i, n-j-1] int temp = matrix[i, j]; matrix[i, j] = matrix[i, n - j - 1]; matrix[i, n - j - 1] = temp; } } } static void PrintMatrix(int[,] matrix) { for (int i = 0; i < matrix.GetLength(0); i++) { for (int j = 0; j < matrix.GetLength(1); j++) { Console.Write(matrix[i, j] + " "); } Console.WriteLine(); } } public static void Main() { int[,] matrix = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; RotateMatrix(matrix); PrintMatrix(matrix); } } }
结果:
练习2Θ : 字符串压缩
题目 : 编写一个函数,对字符串进行基本的压缩,如果压缩后的字符串不比原字符串短,则返回原字符串。
namespace Djproject { internal class StringCompressor { public static string CompressString(string str) { if (string.IsNullOrEmpty(str)) return str; StringBuilder compressed = new StringBuilder(); char currentChar = str[0]; int count = 1; for (int i = 1; i < str.Length; i++) { if (str[i] == currentChar) { count++; } else { compressed.Append(currentChar); compressed.Append(count); currentChar = str[i]; count = 1; } } // 添加最后一个字符及其计数 compressed.Append(currentChar); compressed.Append(count); // 检查压缩后的字符串是否更短 if (compressed.Length < str.Length) { return compressed.ToString(); } else { return str; } } public static void Main() { Console.WriteLine(CompressString("aabcccccaaa")); } } }
结果:
练习21: 有效的括号序列
题目 : 编写一个函数,检查括号序列是否有效。有效的括号序列要求每对括号都能正确闭合。
namespace Djproject { internal class ValidParentheses { public static bool IsValid(string s) { Stack<char> stack = new Stack<char>(); foreach (char c in s) { if (c == '(' || c == '[' || c == '{') { // 如果是左括号,压入栈中 stack.Push(c); } else if (c == ')' || c == ']' || c == '}') { // 如果是右括号,需要判断栈是否为空以及栈顶的左括号是否与之匹配 if (stack.Count == 0) { // 栈为空,没有匹配的左括号 return false; } char topChar = stack.Pop(); // 弹出栈顶的左括号 if ((c == ')' && topChar != '(') || (c == ']' && topChar != '[') || (c == '}' && topChar != '{')) { // 括号不匹配 return false; } } } // 遍历完整个序列后,如果栈为空,则序列有效 return stack.Count == 0; } public static void Main() { Console.WriteLine(IsValid("()[]{}")); } } }
结果:
练习22: 最长公共前缀
题目 : 编写一个函数,找出一组字符串中的最长公共前缀。
namespace Djproject { internal class LongestCommonPrefix { public static string FindLongestCommonPrefix(string[] strs) { if (strs == null || strs.Length == 0) { return ""; } string prefix = strs[0]; // 假设第一个字符串为最长公共前缀 for (int i = 1; i < strs.Length; i++) { while (strs[i].IndexOf(prefix, StringComparison.Ordinal) != 0) { // 如果当前字符串不以prefix开头,则缩短prefix if (prefix.Length == 0) { // 如果prefix已经缩短到空字符串,说明没有公共前缀 return ""; } prefix = prefix.Substring(0, prefix.Length - 1); } } return prefix; } public static void Main() { string[] strs = { "flower ", "flow ", "flight " }; Console.WriteLine(FindLongestCommonPrefix(strs)); } } }
结果: