C# .NET面试系列九:常见的算法

举报
GoodTimeGGB 发表于 2024/03/10 15:55:56 2024/03/10
【摘要】 1. 求质数// 判断一个数是否为质数的方法public static bool IsPrime(int number){ if (number < 2) { return false; } for (int i = 2; i <= Math.Sqrt(number); i++) { if (number % i == 0) ...

1. 求质数

// 判断一个数是否为质数的方法
public static bool IsPrime(int number)
{
    if (number < 2)
    {
        return false;
    }

    for (int i = 2; i <= Math.Sqrt(number); i++)
    {
        if (number % i == 0)
        {
            return false;
        }
    }

    return true;
}

class Program
{
    static void Main()
    {
        Console.Write("请输入一个正整数作为范围的上限:");
        int upperLimit;
        // 输入上限,并确保输入为正整数
        while (!int.TryParse(Console.ReadLine(), out upperLimit) || upperLimit <= 0)
        {
            Console.Write("请输入有效的正整数:");
        }
        Console.WriteLine($"在 1 到 {upperLimit} 的范围内的质数有:");
        // 查找并输出范围内的质数
        for (int number = 2; number <= upperLimit; number++)
        {
            if (Util.IsPrime(number))
            {
                Console.Write($"{number} ");
            }
        }
        Console.ReadLine();
    }
}

以上是一个简单的 C# 程序,用于找到一定范围内的质数(素数)。

这个程序首先要求用户输入一个正整数作为查找质数的范围上限,然后使用 IsPrime 方法判断每个数是否为质数,并输出在指定范围内的所有质数。 IsPrime 方法使用了试除法,检查一个数是否有除了 1 和自身以外的因子。

2. 有一列数1,1,2,3,5,…求第30个数.

在斐波那契数列中,通常是第一个和第二个数是1,后续的每个数是前两个数之和。因此,第30个数可以通过递归或循环方式计算。

public static long Fibonacci(int n)
{
    if (n <= 0)
    {
        return 0;
    }
    else if (n == 1 || n == 2)
    {
        return 1;
    }
    else
    {
        return Fibonacci(n - 1) + Fibonacci(n - 2);
    }
}
class Program
{
    static void Main()
    {
        int n = 30;
        long result = Fibonacci(n);

        Console.WriteLine($"第 {n} 个数是:{result}");
        Console.ReadLine();
    }
}

请注意,递归方法在计算大数时可能会变得很慢,因为它重复计算相同的子问题。在实际应用中,为了提高效率,可以使用迭代或其他优化方法来计算斐波那契数列。

3. 冒泡排序

冒泡排序是一种简单的排序算法,其基本思想是通过多次交换相邻的元素,将较大的元素逐步移动到数组的末尾,实现排序。以下是 C# 中冒泡排序的实现:

public static void BubbleSort(int[] arr)
{
    int n = arr.Length;

    for (int i = 0; i < n - 1; i++)
    {
        for (int j = 0; j < n - 1 - i; j++)
        {
            // 如果前一个元素大于后一个元素,则交换它们
            if (arr[j] > arr[j + 1])
            {
                Swap(ref arr[j], ref arr[j + 1]);
            }
        }
    }
}

public static void Swap(ref int a, ref int b)
{
    int temp = a;
    a = b;
    b = temp;
}

public static void PrintArray(int[] arr)
{
    foreach (int num in arr)
    {
        Console.Write(num + " ");
    }
    Console.WriteLine();
}

class Program
{
    static void Main()
    {
        int[] array = { 5, 2, 9, 1, 5, 6 };
        Console.WriteLine("排序前的数组:");
        PrintArray(array);

        BubbleSort(array);

        Console.WriteLine("\n排序后的数组:");
        PrintArray(array);

        Console.ReadLine();
    }
}

在这个示例中,BubbleSort 方法执行冒泡排序,Swap 方法用于交换数组中两个元素的位置。程序首先输出未排序的数组,然后执行冒泡排序,最后输出排序后的数组。

4. 请编写一个函数,能够计算10以内数的阶乘,尽量采用递归算法。(10!=3628800)。

以下是一个使用递归算法计算10以内数的阶乘的 C# 函数:

public static long CalculateFactorial(int n)
{
    if (n == 0 || n == 1)
    {
        return 1;
    }
    else
    {
        return n * CalculateFactorial(n - 1);
    }
}

class Program
{
    static void Main()
    {
        int n = 10;
        long factorial = CalculateFactorial(n);

        Console.WriteLine($"{n} 的阶乘是:{factorial}");
        Console.ReadLine();
    }
}

这个程序中的 CalculateFactorial 函数使用递归算法计算阶乘。递归基线是当输入为0或1时,返回1(0! 和 1! 都等于1)。否则,递归地调用函数,将输入减一,然后与原来的输入相乘。这样递归地进行下去,直到达到基线情况。

5. 请编程实现此方法。将输入的整型数组,合并转换为逗号分隔的字符串。

例如输入参数为整型数组{9,7,2},那么输出结果为字符串"9,7,2"。

public static string MergeAndConvertToString(int[] array)
{
    // 使用 string.Join 方法将整型数组中的元素连接成一个字符串,以逗号分隔
    string result = string.Join(", ", array);
    return result;
}

class Program
{
    static void Main()
    {
        int[] numbers = { 1, 2, 3, 4, 5 };
        string result = MergeAndConvertToString(numbers);
        Console.WriteLine("合并后的字符串:" + result);
        Console.ReadLine();
    }
}

在这个示例中,MergeAndConvertToString 方法使用 string.Join 方法,该方法接受一个分隔符(逗号和空格)和一个整型数组,并返回将数组中的元素连接成的字符串。最后,该字符串被输出到控制台。

6. 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。

public static int[] GenerateRandomArray(int length)
{
    int[] array = new int[length];
    Random random = new Random();
    for (int i = 0; i < length; i++)
    {
        int randomNumber;
        do
        {
            // 生成不重复的随机数
            randomNumber = random.Next(1, 101);
        } while (Array.Exists(array, element => element == randomNumber));
        array[i] = randomNumber;
    }
    return array;
}

class Program
{
    static void Main()
    {
        int[] randomArray = Util.GenerateRandomArray(100);
        Console.WriteLine("生成的随机数组:");
        Util.PrintArray(randomArray);
        Console.ReadLine();
    }
}

在这个示例中,GenerateRandomArray 方法使用 Random 类生成不重复的随机数,并将它们插入到数组中。Array.Exists 方法用于检查数组中是否已经存在当前生成的随机数。最后,程序输出生成的随机数组。

7. 请将字符串"I am a student"按单词逆序输出 如"student a am I"

public static string ReverseWords(string input)
{
    // 将字符串按空格分割成单词数组
    string[] words = input.Split(' ');
    // 使用 Array.Reverse 方法逆序数组
    Array.Reverse(words);
    // 使用 string.Join 方法将逆序后的单词数组连接成字符串
    string reversedString = string.Join(" ", words);
    return reversedString;
}

class Program
{
    static void Main()
    {
        string inputString = "I am a student";
        string reversedString = Util.ReverseWords(inputString);
        Console.WriteLine("原始字符串:" + inputString);
        Console.WriteLine("逆序输出:" + reversedString);
        Console.ReadLine();
    }
}

在这个示例中,ReverseWords 方法首先使用 Split 方法将输入字符串按空格分割成单词数组,然后使用 Array.Reverse 方法逆序数组,最后使用 string.Join 方法将逆序后的单词数组连接成字符串。程序输出原始字符串和逆序输出的结果。

8. C# 取两个数组的相同元素

摘要: 以往我们都是肯定绞尽脑汁,肯定什么循环,元素大小,什么因素都考虑进去。但是现在采用Linq可以很好的解决这个问题。找出两个或多个数组的相同项。代码如下:

public static int[] GetCommonElements(int[] array1, int[] array2)
{
    // 使用 LINQ 的 Intersect 方法获取两个数组的交集
    int[] commonElements = array1.Intersect(array2).ToArray();
    return commonElements;
}

class Program
{
    static void Main()
    {
        int[] array1 = { 1, 2, 3, 4, 5 };
        int[] array2 = { 3, 4, 5, 6, 7 };
        int[] commonElements = Util.GetCommonElements(array1, array2);
        Console.WriteLine("数组1:" + string.Join(", ", array1));
        Console.WriteLine("数组2:" + string.Join(", ", array2));
        Console.WriteLine("相同元素:" + string.Join(", ", commonElements));
        Console.ReadLine();
    }
}

在这个示例中,GetCommonElements 方法使用 LINQ 的 Intersect 方法获取两个数组的交集。程序输出两个数组和它们的相同元素。请注意,使用 LINQ 的方法需要确保项目引用了 System.Linq 命名空间。

9. 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

public static void GenerateThreeDigitNumbers()
{
    for (int i = 1; i <= 4; i++)
    {
        for (int j = 1; j <= 4; j++)
        {
            for (int k = 1; k <= 4; k++)
            {
                // 确保三个数字互不相同
                if (i != j && i != k && j != k)
                {
                    int number = i * 100 + j * 10 + k;
                    Console.Write(number + " ");
                }
            }
        }
    }
}

class Program
{
    static void Main()
    {
        Console.WriteLine("能组成的互不相同且无重复数字的三位数有:");
        Util.GenerateThreeDigitNumbers();
        Console.ReadLine();
    }
}

在这个程序中,使用三个嵌套的循环遍历数字1、2、3、4,通过组合的方式生成所有可能的三位数,并在组合过程中确保这三个数字互不相同。程序输出所有满足条件的三位数。

10. 用C#写一段选择排序算法,要求用自己的编程风格。

public static void SelectionSort(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;
            }
        }

        // 将最小元素与当前位置交换
        Swap(ref arr[i], ref arr[minIndex]);
    }
}

class Program
{
    static void Main()
    {
        int[] array = { 64, 25, 12, 22, 11 };
        Console.WriteLine("排序前的数组:");
        Util.PrintArray(array);
        Util.SelectionSort(array);
        Console.WriteLine("\n排序后的数组:");
        Util.PrintArray(array);
        Console.ReadLine();
    }
}

在这个示例中,SelectionSort 方法实现了选择排序算法。程序首先输出排序前的数组,然后进行选择排序,最后输出排序后的数组。 Swap 方法用于交换数组中两个元素的位置,PrintArray 方法用于输出数组。

11. 有一个10个数的数组,计算其中不重复数字的个数。{3,5,9,8,10,5,3},用HashSet。

public static int CountUniqueNumbers(int[] arr)
{
    // 使用 HashSet 来存储不重复的数字
    HashSet<int> uniqueNumbers = new HashSet<int>(arr);

    return uniqueNumbers.Count;
}

class Program
{
    static void Main()
    {
        int[] numbers = { 3, 5, 9, 8, 10, 5, 3 };
        int uniqueCount = Util.CountUniqueNumbers(numbers);
        Console.WriteLine("数组中不重复数字的个数:" + uniqueCount);
        Console.ReadLine();
    }
}

在这个示例中,CountUniqueNumbers 方法接受一个整型数组,并使用 HashSet 来存储不重复的数字。最后,通过 Count 属性获取 HashSet 中不重复数字的个数。程序输出数组中不重复数字的个数。

12. A、B、C、D、E五名学生有可能参加计算机竞赛,根据下列条件判断哪些人参加了竞赛:

(1)A参加时,B也参加;

(2)B和C只有一个人参加;

(3)C和D或者都参加,或者都不参加;

(4)D和E中至少有一个人参加;

(5)如果E参加,那么A和D也都参加。

/// <summary>
/// 数组遍历
/// </summary>
public static void CheckCombinations()
{
    char[] students = { 'A', 'B', 'C', 'D', 'E' };

    // 遍历所有可能的组合
    for (int a = 0; a <= 1; a++)
    {
        for (int b = 0; b <= 1; b++)
        {
            for (int c = 0; c <= 1; c++)
            {
                for (int d = 0; d <= 1; d++)
                {
                    for (int e = 0; e <= 1; e++)
                    {
                        // 检查满足条件的组合
                        if (Condition1(a, b) &&
                            Condition2(b, c) &&
                            Condition3(c, d) &&
                            Condition4(d, e) &&
                            Condition5(e, a, d))
                        {
                            // 输出符合条件的组合
                            Console.Write($"A{(a == 1 ? "参加" : "不参加")} ");
                            Console.Write($"B{(b == 1 ? "参加" : "不参加")} ");
                            Console.Write($"C{(c == 1 ? "参加" : "不参加")} ");
                            Console.Write($"D{(d == 1 ? "参加" : "不参加")} ");
                            Console.Write($"E{(e == 1 ? "参加" : "不参加")}\n");
                        }
                    }
                }
            }
        }
    }
}
static bool Condition1(int a, int b)
{
    return a == 0 || b == 1;
}

static bool Condition2(int b, int c)
{
    return (b == 1 && c == 0) || (b == 0 && c == 1);
}

static bool Condition3(int c, int d)
{
    return c == 1 || d == 1 || (c == 0 && d == 0);
}

static bool Condition4(int d, int e)
{
    return d == 1 || e == 1;
}

static bool Condition5(int e, int a, int d)
{
    return e == 0 || (a == 1 && d == 1);
}
class Program
{
    static void Main()
    {
        Console.WriteLine("可能参加计算机竞赛的学生组合:");
        Util.CheckCombinations();
        Console.ReadLine();
    }
}

在这个示例中,我们使用嵌套循环遍历所有可能的组合,然后根据条件进行检查,满足条件的组合会被输出。这样我们就找到了符合给定条件的学生参加计算机竞赛的可能组合。

13. 程序设计:猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。

class Cat
{
    public void Shout()
    {
        Console.WriteLine("猫大叫一声!");
    }
}

class Mouse
{
    private int number;

    public Mouse(int number)
    {
        this.number = number;
    }

    public void RunAway()
    {
        Console.WriteLine($"老鼠 {number} 逃跑了!");
    }
}

class Owner
{
    public void WakeUp()
    {
        Console.WriteLine("主人被惊醒了!");
    }
}
class Program
{
    static void Main()
    {
        Console.WriteLine("猫大叫一声...");
        Cat cat = new Cat();
        Mouse[] mice = new Mouse[5];
        for (int i = 0; i < mice.Length; i++)
        {
            mice[i] = new Mouse(i + 1);
        }
        Owner owner = new Owner();
        // 猫叫一声,老鼠逃跑,主人被惊醒
        cat.Shout();
        foreach (Mouse mouse in mice)
        {
            mouse.RunAway();
        }
        owner.WakeUp();
        Console.ReadLine();
    }
}

在这个示例中,我们定义了 Cat 类、Mouse 类和 Owner 类,分别表示猫、老鼠和主人。程序模拟了猫叫一声后,老鼠逃跑,主人被惊醒的情景。

本系列文章题目摘自网络,答案重新梳理
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。