C#经典算法面试题
网络上收集的一些C#经典算法面试题,分享给大家
# 递归算法
## C#递归算法计算阶乘的方法
> 一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。1808年,基斯顿·卡曼引进这个表示法。
原理:亦即n!=1×2×3×...×(n-1)×n。阶乘亦可以递归方式定义:0!=1,n!=(n-1)!×n。
/// <summary>/// C#递归算法计算阶乘的方法/// 一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。1808年,基斯顿·卡曼引进这个表示法。/// 亦即n!=1×2×3×...×(n-1)×n。阶乘亦可以递归方式定义:0!=1,n!=(n-1)!×n。/// 最终输出结果:120/// </summary>public static void RecursiveFactorial(){int result = Factorial(5);Console.WriteLine("5的阶乘为:" + result);//5!=120}public static int Factorial(int n){if (n == 0 || n == 1){return 1;}else{// 递归调用:当前数n乘以前面所有数的阶乘return n * Factorial(n - 1);}}
## C#递归算法数组求
/// <summary>/// 递归算法数组求/// 最终输出结果为:259/// </summary>public static void RecursiveArraySum(){int[] numbers = { 1, 88, 66, 4, 100 };int sum = ArraySum(numbers, 0);Console.WriteLine("数组元素的总和为:" + sum);}/// <summary>/// 计算数组元素的总和/// </summary>/// <param name="arr">arr</param>/// <param name="index">index</param>/// <returns></returns>public static int ArraySum(int[] arr, int index){if (index >= arr.Length){// 基本情况:数组为空或者已经遍历完所有元素return 0;}else{// 递归调用:当前元素加上剩余元素的总和return arr[index] + ArraySum(arr, index + 1);}}
## C#使用递归算法来实现求解斐波纳契数列中第30位数的值
> 一列数的规则如下 : 1 、 1 、 2 、 3 、 5 、 8 、 13 、 21 、 34… 求第 30 位数是多少, 用递归算法实现。
/// <summary>/// 使用递归算法来实现求解斐波纳契数列中第30位数的值/// 一列数的规则如下 : 1 、 1 、 2 、 3 、 5 、 8 、 13 、 21 、 34… 求第 30 位数是多少, 用递归算法实现/// 最终输出结果为:832040/// </summary>public static void FibonacciSum(){int n = 30;int result = Fibonacci(n);Console.WriteLine("第 " + n + "位斐波那契数是:" + result);}public static int Fibonacci(int n){if (n <= 0){return 0;}else if (n > 0 && n <= 2){return 1;}else{// 递归情况:调用自身计算前两个数字之和return Fibonacci(n - 1) + Fibonacci(n - 2);}}
## 使用C#语言编写的递归算法来计算1+2+3+4+…+100的结果
/// <summary>/// 使用C#语言编写的递归算法来计算1+2+3+4+…+100的结果/// 最终输出结果是:5050/// </summary>public static void RecursiveAlgorithmSum(){int result = SumNumbers(100);Console.WriteLine("1+2+3+4+...+100 = " + result);}public static int SumNumbers(int n){if (n == 1){return 1;//递归结束条件}else{return n + SumNumbers(n - 1);}}
# C#常见排序算法
## 冒泡排序算法
### 双重循环方式实现冒泡排序
/// <summary>/// 双重循环方式实现冒泡排序/// </summary>public static void BubbleSort(){int[] arr = { 1, 8, 9, 5, 6, 2, 3, 4, 7 };int arrLength = arr.Length;for (int i = 0; i < arrLength - 1; i++){for (int j = 0; j < arrLength - i - 1; j++){if (arr[j] > arr[j + 1]){//交换arr[j]和arr[j+1]的值int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}Console.WriteLine("排序后结果:" + string.Join(", ", arr));}
### 递归方式实现冒泡排序
/// <summary>/// 递归方式实现冒泡排序/// </summary>/// <param name="arr">arr</param>/// <param name="arrLength">arrLength</param>public static void RecursiveBubbleSort(int[] arr, int arrLength){if (arrLength == 1)return;for (int i = 0; i < arrLength - 1; i++){if (arr[i] > arr[i + 1]){//交换arr[i]和arr[i+1]的值int temp = arr[i];arr[i] = arr[i + 1];arr[i + 1] = temp;}}RecursiveBubbleSort(arr, arrLength - 1);}public static void RecursiveBubbleSortRun(){int[] arr = { 1, 8, 9, 5, 6, 2, 3, 4, 7 };int arrLength = arr.Length;RecursiveBubbleSort(arr, arrLength);Console.WriteLine("排序后结果:" + string.Join(", ", arr));}
## 选择排序算法
> 选择排序是一种简单直观的排序算法,它的工作原理如下:
> 选择排序算法的核心思想是每次从未排序的部分中找到最小元素,然后将其与未排序部分的第一个元素交换位置。通过不断进行这个过程,逐步将最小元素放到正确的位置,完成整个数组的排序。
public class 选择排序算法{/// <summary>/// 选择排序算法/// 选择排序算法的核心思想是每次从未排序的部分中找到最小元素,然后将其与未排序部分的第一个元素交换位置。/// 通过不断进行这个过程,逐步将最小元素放到正确的位置,完成整个数组的排序。/// </summary>public static void SelectionSortAlgorithmMain(){int[] array = { 64, 25, 12, 22, 11 };Console.WriteLine("原始数组: ");PrintArray(array);SelectionSortAlgorithm(array);Console.WriteLine("排序后的数组: ");PrintArray(array);}static void SelectionSortAlgorithm(int[] arr){int n = arr.Length;for (int i = 0; i < n - 1; i++){// 在未排序部分中找到最小元素的索引int minIndex = i;for (int j = i + 1; j < n; j++){if (arr[j] < arr[minIndex]){minIndex = j;}}// 将最小元素与未排序部分的第一个元素交换位置int temp = arr[minIndex];arr[minIndex] = arr[i];arr[i] = temp;}}static void PrintArray(int[] arr){int n = arr.Length;for (int i = 0; i < n; ++i){Console.Write(arr[i] + " ");}Console.WriteLine();}}
# C#List集合相关
## C#List RemoveAt(按照索引移除)、Remove(按照对象移除)
/// <summary>/// 获取移除后的列表数据/// 考察内容:C#List RemoveAt(按照索引移除)、Remove(按照对象移除)/// </summary>/// <returns></returns>public static List<int> GetAfterRemoveListData(){List<int> list = new List<int>();for (int i = 1; i <= 10; i++){list.Add(i);}for (int i = 0; i < 5; i++){list.RemoveAt(i);//单独使用输出结果:2,4,6,8,10,按照索引移除list.Remove(i);//单独使用输出结果:5,6,7,8,9,10,按照对象移除}//以上两种同时使用时输出结果:6,7,9return list;}
# 其他算法
## 实现一个方法,对于输入的任意字符串,统计出其中每一种字符出现的次数
```C#
/** 字典的定义
必须包含名空间System.Collection.Generic
Dictionary里面的每一个元素都是一个键值对(由二个元素组成:键和值)
键必须是唯一的,而值不需要唯一的
键和值都可以是任何类型(比如:string, int, 自定义类型,等等)
通过一个键读取一个值的时间是接近O(1)
键值对之间的偏序可以不定义
*/
static void CountChar(string str)
{Dictionary<char, int> dic = new Dictionary<char, int>();foreach (char c in str){if (dic.ContainsKey(c))dic[c]++;elsedic.Add(c, 1);}foreach (KeyValuePair<char, int> p in dic){Console.WriteLine("字符{0},出现的次数{1}", p.Key.ToString(), p.Value.ToString());}
}
## 实现一个将字符串转换为整数的方法,不要使用int.Parse、int.TryParse、Convert.ToInt32等任何类库方法
public static bool TryParseToInt(string strData, out int num){if (string.IsNullOrWhiteSpace(strData)){num = 0;return false;}int result = 0;bool minus = strData[0] == '-' ? true : false;if (minus && strData.Length == 1){num = 0;return false;}for (int i = minus ? 1 : 0; i < strData.Length; i++){if (strData[i] >= '0' && strData[i] <= '9'){result = strData[i] - 48 + result * 10;}else{num = 0;return false;}}num = minus ? -result : result;return true;}static void Main(string[] args){//打印输出getValue为转化而成的整数var result = TryParseToInt("99", out int getValue);}
## 求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m
//通过顺序规律写程序,同时也知道flag标志位的重要性static int F1(int m) { int sum =0; bool flag =true; for (int i = 1; i <= m; i++) { if (flag) //一次是默认是True,下下也为True sum += i; else sum -= i; flag = !flag; } return sum; } //通过奇偶性 static int F2(int m) { int sum = 0; for (int i = 1; i <= m; i++) { if (i % 2 >0) //即为奇数 sum += i; else sum -= i; } return sum; }
## 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
class Program { static void Main(string[] args) { //有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? //分解题目 //条件:四个数字1、2、3、4 ;三位数:百位、十位、个位 //要求:互不相同;无重复数字:每个数字在三位中只出现一次 //结果:多少个? 都是多少? int count = 0; //统计个数 for (int bw = 1; bw <= 4; bw++) { for (int sw = 1; sw <= 4; sw++) { if (sw!= bw) //很显然,只有百位和十位不同的情况下才能谈个位。 { for (int gw = 1; gw <= 4; gw++) { if (gw != sw && gw != bw) //百位用过的,十位就不能用;百位和十位都用过的,个位就不能用 { count++; Console.WriteLine("{0}{1}{2}", bw, sw, gw); } } } } } Console.WriteLine("一共有{0}个", count); Console.Read(); } }
## 一个6位数乘以一个3位数,得到一个结果。但不清楚6位数的两个数字是什么,而且结果中有一位数字也不清楚,请编程找出问好代表的数字,答案可能有多个。
> 表达式:12?56?*123 = 154?4987
for (int a = 0; a < 10; a++) { for (int b = 0; b < 10; b++) { for (int c = 0; c < 10; c++) { if ((120560 + a + b * 1000) * 123 == 15404987 + c * 10000) { Console.WriteLine(a); Console.WriteLine(b); Console.WriteLine(c); } } } } Console.Read();
## 有一个字符串 "I am a good man",设计一个函数,返回 "man good a am I"。
static string Reverse() { string s = "I am a good man"; string[] arr = s.Split(' '); string res = ""; for (int i = arr.Length - 1; i >= 0; i--) { res += arr[i]; if (i > 0) res += " "; } return res; }
## C# 九九乘法表算法实现
static void Mu() { string t = string.Empty; for (int i = 1; i < 10; i++) { for (int j = 1; j <= i; j++) { t = string.Format("{0}*{1}={2} ", j, i, (j * i)); Console.Write(t); //if (j * i < 82) // Console.Write(" "); if (i == j) Console.Write("\n"); } } }
## 在1~10000的整数中,找出同时符合以下条件的数:a.必须是质数。b.该数字各位数字之和为偶数,如数字12345,各位数字之和为1+2+3+4+5=15,不是偶数。
> 本题考了两个地方:
> (1)、质数的理解:质数就是所有比1大的整数中,除了1和它本身外,不再有别的约数。2是一个不是奇数的质数,它既是质数也是偶数,面试者极容易忽略这点。判断数N是否为质数要直接从3开始判断(如果N不是2),首先不能是偶数,然后再判断是否能被3、5、7....整除,直到sqrt(N)止。
> (2)、求各位数字之和,可以通过循环取余的办法。
using System; using System.Collections.Generic; class program { static void Mian(string[] args) { int N =1000; List<int> primes = new List<int>(); primes.Add(2); Console.Write(2+" "); for(int i=3;i<N,i+=2) { if(!) } } static bool IsDigitSumEven(int n) { int sum=0; while(n>0) { sum +=n% 10; n /=10; } return sum%2==0; } }
相关文章:

C#经典算法面试题
网络上收集的一些C#经典算法面试题,分享给大家 # 递归算法 ## C#递归算法计算阶乘的方法 > 一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。1808年,基斯顿…...

vulnhub靶场【DriftingBlues】之9 final
前言 靶机:DriftingBlues-6,IP地址192.168.1.66 攻击:kali,IP地址192.168.1.16 都采用虚拟机,网卡为桥接模式 主机发现 使用arp-scan -l或netdiscover -r 192.168.1.1/24 信息收集 使用nmap扫描端口 网站探测 访…...

有124个叶子节点的,完全二叉树最多有多少个节点
n=n0n1n2 其中n0为叶子节点, n2=n0-1 完全二叉树的定义和性质 最后化简,n=2*n0n1-1...

从RNN到Transformer:生成式AI自回归模型的全面剖析
个人主页:chian-ocean 文章专栏 生成式AI中的自回归模型详解 在生成式AI的飞速发展中,自回归模型作为核心技术之一,成为文本生成、语音合成、图像生成等领域的重要支柱。本文将全面探讨自回归模型的原理、架构、实际应用,并结合…...

Java爬虫大冒险:如何征服1688商品搜索之巅
在这个信息爆炸的时代,数据就是力量。对于电商平台而言,数据更是金矿。今天,我们要踏上一场Java爬虫的冒险之旅,目标是征服1688这个B2B电商巨头,获取按关键字搜索的商品信息。这不仅是技术的挑战,更是智慧的…...

基于Spring Boot的无可购物网站系统
一、系统背景与意义 随着互联网的快速发展,电子商务已经成为人们日常生活的重要组成部分。构建一个稳定、高效、可扩展的电商平台后端系统,对于满足用户需求、提升用户体验、推动业务发展具有重要意义。Spring Boot作为当前流行的Java开发框架ÿ…...

智能人家谱程序创意
实现一个家谱程序,并结合自传、视频、图片资料和智能对话系统,涉及到多个领域的技术:自然语言处理(NLP)、机器学习、计算机视觉、多媒体处理和数据存储。下面,我为你制定一个可执行的计划,详细阐…...

Redis 7.x哨兵模式如何实现?基于Spring Boot 3.x版
大家好,我是袁庭新。 在Redis主从复制模式中,因为系统不具备自动恢复的功能,所以当主服务器(master)宕机后,需要手动把一台从服务器(slave)切换为主服务器。在这个过程中࿰…...

解决QTCreator在Debug时无法显示std::string类型的问题
环境: 操作系统:Ubuntu 20.04.6 LTS QT版本:Qt Creator 4.11.0 问题: Debug时,无法显示std::string类型的值,如下图: 解决方法: 修改/usr/share/qtcreator/debugger/stdtypes.py…...

leetcode 面试经典 150 题:无重复字符的最长子串
链接无重复字符的最长子串题序号3类型字符串解题方法滑动窗口难度中等 题目 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 …...

0101多级nginx代理websocket配置-nginx-web服务器
1. 前言 项目一些信息需要通过站内信主动推动给用户,使用websocket。web服务器选用nginx,但是域名是以前通过阿里云申请的,解析ip也是阿里云的服务器,甲方不希望更换域名。新的系统需要部署在内网服务器,简单拓扑图如…...

【前端】Jquery拍照,通过PHP将base64编码数据转换成PNG格式,并保存图像到本地
目录 一、需求 二、开发语言 三、效果 四、业务逻辑: 五、web端调用摄像头 六、示例代码 1、前端 2、后端 一、需求 web端使用jquery调用摄像头拍照,并使用PHP把base64编码转换成png格式图片,下载到本地。 由于js不能指定图片存储的…...

websocket再项目中的使用
WebSocket在项目中的使用主要包括以下几个方面: WebSocket的基本概念和原理: 定义:WebSocket是一种基于TCP的协议,实现了浏览器与服务器之间的全双工通信。它通过HTTP/1.1协议的101状态码进行握手,建立连接…...

ajax同步执行async:false无效的解决方法
无效的情况: function ManHourCheck() {var StartDate $("#StartDate").val();//日报日期var EndDate $("#EndDate").val();//完成日期var UserID $("#UserID").val();//员工ID$.ajax({async: false,//加了这一行也没用!!!!!!!!!!…...

基于Qt的登陆界面设计
目标 自由发挥登录界面的应用场景,实现一个登录窗口的界面。 要求:每行代码都要有注释 代码 // 设置窗口大小为600x400像素 this->resize(600,400); // 设置窗口标题为"TheWitcher 巫师3:狂猎" this->setWindowTitle(&qu…...

HarmonyOS 输入框组件:TextInput 和 TextArea 深度解析
输入框组件是移动端开发中最常见的组件之一,常用于响应用户的输入操作,比如评论区的文本输入、聊天框的消息输入、表单内容填写等场景。在 HarmonyOS 中,TextInput 和 TextArea 分别用于单行和多行输入操作。除此之外,它们还可以与…...

【Golang】 Go 语言中的 Struct、JSON 和 Map 互转:详细指南
Go 语言中的 Struct、JSON 和 Map 互转:详细指南 在 Go 语言中,处理 JSON 数据、结构体类型和映射(map)是与 API、配置或数据库交互时非常常见的任务。理解如何在这些数据类型之间无缝转换对于高效的 Go 编程至关重要。以下是如何将 Go 结构体转换为 JSON、将 JSON 转换为…...

Azure Function流式返回
最近用azure function做了一个api和llm交互,需要流式返回。但是默认不支持流返回,搜索了一下。记录。 官方文档:https://techcommunity.microsoft.com/blog/azurecompute/azure-functions-support-for-http-streams-in-python-is-now-in-prev…...

智能座舱进阶-应用框架层-Jetpack主要组件
Jetpack的分类 1. DataBinding:以声明方式将可观察数据绑定到界面元素,通常和ViewModel配合使用。 2. Lifecycle:用于管理Activity和Fragment的生命周期,可帮助开发者生成更易于维护的轻量级代码。 3. LiveData: 在底层数据库更…...

GitLab分支管理策略和最佳实践
分支管理是 Git 和 GitLab 中非常重要的部分,合理的分支管理可以帮助团队更高效地协作和开发。以下是一些细化的分支管理策略和最佳实践: 1. 分支命名规范 • 主分支:通常命名为 main 或 master,用于存放稳定版本的代码。 • …...

【Unity】【VR开发】实现VR屏幕共享应用的几个重要插件和参考资料分享
【背景】 做了一个可以在局域网远程屏幕的VR应用,如果有相同兴趣的朋友也可以参考下我用的几个插件。 【使用或相关的关键插件】 piping server:这个是最基底的插件,基于它实现的信令通信。 https://github.com/nwtgck/piping-server/blob…...

数据结构---------二叉树前序遍历中序遍历后序遍历
以下是用C语言实现二叉树的前序遍历、中序遍历和后序遍历的代码示例,包括递归和非递归(借助栈实现)两种方式: 1. 二叉树节点结构体定义 #include <stdio.h> #include <stdlib.h>// 二叉树节点结构体 typedef struct…...

浏览器引入elasticsearch-head插件
elasticsearch-head插件下载: 链接: https://pan.baidu.com/s/1Dz3aU42HZCNg45iJoDOsMg?pwduvhg 提取码: uvhg 1、打开浏览器设置 2、选择拓展程序 3、选择elasticsearch-head插件下载 4、打开es-head插件 5、修改ip 6、登录...

【ELK】Filebeat采集Docker容器日志
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 介绍filebeat是如何工作的 使用部署filebeat 介绍 Filebeat 是一个用于转发和集中日志数据的轻量级传送器。 Filebeat 作为agent安装在服务器上,监视指…...

异步线程池与CountDownLatch
异步线程池 顾名思义,一个专门用来处理异步任务的线程池。可以避免线程的开销以及非阻塞的执行任务。 CountDownLatch 一个同步工具类,用于 让一个或多个线程等待一组操作完成。 业务场景 支付订单时,用户可以使用多张优惠劵,…...

在图像上显示掩码、框和点的通用函数
在图像上显示掩码、框和点的通用函数 背景介绍函数实现与用途1. 显示掩码函数:`show_mask`2. 显示边界框函数:`show_box`3. 在图像上显示点函数:`show_points`4. 综合显示框和点函数:`show_points_and_boxes_on_image`5. 显示掩码并返回图像函数:`show_mask_on_image`6. 显…...

基于Matlab的变压器仿真模型建模方法(11):三相三绕组换流变压器的建模仿真
1.概述 换流变压器是直流输电系统中的关键设备,主要负责连接交流和直流系统,并实现电能的转换与传输。换流变压器在直流输电系统中的主要用途包括:传送电力:将电能从交流系统传输到直流系统或从直流系统传输到交流系统;电压变换:把交流系统电压变换到换流器所需的换相电压…...

代码随想录算法训练营day46|动态规划part12
今天就结束动态规划章节了,以后还要多加练习。 今天的两道题都很有难度,647回文子串的思路非常巧妙,因为用一维dp数组比较难表示子串的起点和终点,所以需要用二维dp数组表示,dp[i][j]表示以i为起点,j为终点…...

【C语言】头文件
所有学习过C语言的朋友都熟悉这样一段代码: #include <stdio.h>int main(int argc, char *argv[]) {return 0; }那么,你真的了解 <stdio.h> 吗? <stdio…...

蓝桥杯——竞赛省赛国赛题分享
目录 一.[蓝桥杯 2013 省 AB] 错误票据 代码如下: 二.[蓝桥杯 2024 省 Java B] 报数游戏 代码如下: 讲解: 三.[蓝桥杯 2014 国 C] 拼接平方数 代码如下: 四.三步问题(递归,上台阶) 代码…...