【面试专题】总结记录40个数据结构与算法的常见问题

在这里插入图片描述

文章目录


问题是开发人员职位面试中不可或缺的一部分。无论我们掌握哪种编程语言,熟悉编程的基本概念都是我们的期望。

编程技能始终是任何编程面试的决定因素。在这篇编程面试问题文章中,我们将讨论你绝对应该知道的前 40 个编程面试问题,以破解这些面试并获得你梦寐以求的工作。

所以事不宜迟,让我们开始吧!

本文中的编程面试问题地址分为 2 类(如下),以使我们的学习更简单。

  1. 概念性面试问题
  2. 编程面试题

我们现在来看看第一类编程面试问题。

关于概念理解的编程面试问题

本节涵盖了一些测试候选人概念理解的编程面试问题。

1. 什么是数据结构?

  • 数据结构是一种存储格式,它定义了数据的存储、组织和操作方式。
  • 一些流行的数据结构是数组、树和图。

2. 什么是数组?

  • 数组通常被称为存储在连续内存位置的项目集合。
  • 存储的项目属于同一类型。
  • 它组织数据,以便可以轻松地对一组相关的值进行排序或搜索。

img

3. 什么是链表?

  • 与数组一样,链表是指一种线性数据结构,其中元素不一定以连续的方式存储。
  • 它基本上是一个节点序列,每个节点指向下一个节点,形成链状结构。

img

4. 什么是后进先出?

  • LIFO 是后进先出的缩写
  • 它是一种访问、存储和检索数据的方式。
  • 它首先提取最后存储的数据。

5. 什么是堆栈?

  • 堆栈是指以 LIFO(后进先出)顺序执行操作的线性数据结构。
  • 在堆栈中,元素只能被访问,从最顶部到底部的元素开始。

6. 什么是先进先出?

  • FIFO 代表先进先出。
  • 它是一种访问、存储和检索数据的方式。
  • 最先存储的数据首先被提取。

img

到目前为止,我们已经涵盖了一些非常基本的编程面试问题。继续前进,我们将更深入地研究该主题。

7. 什么是队列?

  • 队列是指以先进先出顺序执行操作的线性数据结构。
  • 在队列中,与堆栈相反,首先删除最近最少添加的元素。

img

8. 什么是二叉树?

  • 二叉树是链表结构的扩展,其中每个节点最多有两个孩子。
  • 二叉树在任何时候都有两个节点,一个左节点和一个右节点。

img

9. 什么是递归?

  • 递归是指基于终止条件调用自身的函数。
  • 它使用 LIFO,因此使用了堆栈数据结构。

接下来的几个编程面试问题将探索我们对 OOP 的了解。

10. 什么是 OOP 概念?

OOP 代表面向对象的编程系统,一种提供对象、类和继承等概念的范式。

11. OOPs中引入了哪些概念?

以下是 OOP 中引入的概念:

  • 对象 - 具有特定状态和行为的现实世界实体。我们可以将其定义为类的实例。
  • 类 - 定义蓝图的逻辑实体,可以从中创建或实例化对象。
  • 继承 - 一个概念,指对象获得父对象的所有属性和行为。它提供代码可重用性。
  • 多态性 - 允许以不同方式执行任务的概念。在Java中,我们使用方法重载和方法覆盖来实现多态性。
  • 抽象 - 隐藏应用程序内部细节并仅显示功能的概念。在Java中,我们使用抽象类和接口来实现抽象。
  • 封装 - 一个概念,指将代码和数据一起包装成一个单元。

这是非常常见的编程面试问题之一,通常允许面试官根据候选人的答案扩展到相关主题

12. 解释什么是二叉搜索树。

  • 二叉搜索树用于以可以非常有效地检索数据的方式存储数据。
  • 左子树包含键小于节点键值的节点。
  • 右子树包含的节点的键大于或等于节点的键值

img

13. 解释双向链表?

  • 双链表被归类为一种特殊类型的链表,其中可以双向遍历数据元素。
  • 这可以通过在每个节点中存在两个链接来实现,一个链接到它旁边的节点,另一个链接到它之前的节点。

img

14. 什么是图表?

  • 图是一种特定类型的数据结构,包含一组有序对。
  • 图中的有序对也称为边或弧,最常用于连接可以存储和检索数据的节点。

15.区分线性和非线性数据结构?

线性数据结构 非线性数据结构
它是一种数据元素彼此相邻的结构 它是一种结构,其中每个数据元素可以连接到两个以上相邻的数据元素
线性数据结构的示例包括链表、数组、队列和堆栈 非线性数据结构的例子包括图和树

16. 什么是双端队列?

  • deque 是一个双端队列。
  • 这是一种可以从任一端插入或删除元素的结构。

17. Stack 和 Array有什么区别?

大批
堆栈遵循后进先出 (LIFO) 模式。这意味着数据访问必须遵循特定顺序,其中要存储的最后一个数据是要提取的第一个数据。 另一方面,数组不遵循特定的顺序,而是可以通过引用数组中的索引元素来访问或调用。

18. 哪种排序算法最好?

  • 排序算法有很多种:冒泡排序、快速排序、气球排序、归并排序、基数排序等等。
  • 没有一种算法可以被认为是最好或最快的,因为它们都针对特定类型的数据结构设计了每种算法,在这些数据结构中表现最好

19. 变量声明如何影响内存?

  • 要保留或分配的内存量取决于存储在该变量中的数据类型。
  • 例如,如果一个变量被声明为“整数类型”,那么将为该特定变量保留 32 位的内存存储空间。

20.什么是动态数据结构?

动态数据结构具有随着程序运行而扩展和收缩的特性。它提供了一种非常灵活的数据操作方法,因为它可以根据要操作的数据的大小进行调整。

这 20 个测试候选人概念理解的编程面试问题让面试者清楚地了解候选人的基础知识有多强

编程面试题

下一组编程面试问题重点测试候选人的编程专业知识,并深入研究各个相关方面。

与以下编程面试问题一起提供的代码屏幕截图可帮助我们清晰地提供问题的答案。

21. 如何在 Java 中反转字符串?

  • 声明一个字符串。
  • 取出该字符串的长度。
  • 循环遍历字符串的字符。
  • 在新字符串中以相反的顺序添加字符。
String str = "hello";

String reverse = "";

int length = str.length();

for (int i = 0; i < length; i++) {
    
    

   reverse = str.charAt(i) + reverse;

}

System.out.println(reverse);

22. 如何判断一个字符串是否是回文?

  • 当一个字符串在反转该字符串中的字符顺序时保持不变时,它就是一个回文。
  • 可以通过先反转原字符串,然后检查反转后的字符串是否等于原字符串来实现。
if (str.equals(reverse)) {
    
    

  System.out.println("Palindrome");

} else {
    
    

  System.out.println("Not Palindrome");

}

23. 求字符串中某个字符出现的次数?

要查找出现次数,请遍历字符串并在每次迭代时搜索该字符;每当找到它时,它都会更新计数。

int count = 0;

char search = 'a';

for (int i = 0; i < length; i++) {
    
    

  if (str.charAt(i) == search) {
    
    

    count++;

  }

}

System.out.println(count);

24. 如何判断给定的两个字符串是否是字谜?

如果两个字符串以不同的顺序包含一组相似的字符,则它们是字谜。

  • 声明一个布尔变量,说明两个字符串的末尾是否是字谜。
  • 首先,检查两个字符串的长度是否相同,如果不是,它们不能是字谜。
  • 将两个字符串都转换为字符数组,然后对它们进行排序。
  • 检查排序后的数组是否相等。如果它们相等,则打印字谜,否则不打印字谜。
boolean anagrmstat = false;

if (str.length() != reverse.length()) {
    
    

  System.out.println(str + " and " + reverse + " not anagrams string");

} else {
    
    

  char[] anagram1 = str.toCharArray();

  char[] anagram2 = reverse.toCharArray();

  Arrays.sort(anagram1);

  Arrays.sort(anagram2);

  anagrmstat = Arrays.equals(anagram1, anagram2);

}

if (anagrmstat == true) {
    
    

  System.out.println(" anagrams string");

} else {
    
    

  System.out.println(" not anagrams string");

}

25. 如何计算字符串中元音和辅音的数量?

  • 循环遍历字符串。
  • 每当发现字符是元音时,使用 if 条件将元音变量加一。否则,增加辅音变量。
  • 打印元音和辅音计数的值。
int vowels = 0;

int consonants = 0;

for (int k = 0; k < str.length(); k++) {
    
    

  char c = str.charAt(k);

  if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u')

    vowels++;

  else

    consonants++;

}

System.out.println("Vowel count is " + vowels);

System.out.println("Consonant count is: " + consonants);

26. 如何获取整数数组中的匹配元素?

  • 声明一个数组。
  • 嵌套几个循环以将数字与数组中的其他数字进行比较。
  • 如果找到,则打印匹配的元素。
int[] a = {
    
     1, 2, 3, 4, 5, 1, 2, 6, 7 };

for (int m = 0; m < a.length; m++) {
    
    

  for (int n = m + 1; n < a.length; n++) {
    
    

    if (a[m] == a[n])

      System.out.print(a[m]);

  }

}

27. 你将如何实现冒泡排序算法?

  • 声明一个数组。
  • 嵌套几个循环来比较数组中的数字。
  • 如果以任何其他顺序找到元素,则该数组将通过替换元素以升序排序。
int[] a = {
    
     1, 2, 7, 6, 4, 9, 12 };

for (int k = 0; k < a.length; k++) {
    
    

  for (int l = 0; l < a.length - l - 1; l++) {
    
    

    if (a[l] > a[l + 1]) {
    
    

      int t = a[l];

      a[l] = a[l + 1];

      a[l + 1] = t;

    }

  }

}

28. 你将如何实现插入排序算法?

  • 我们假设要对数组中的第一个元素进行排序。第二个元素单独存储在密钥中。这对前两个元素进行排序。然后,我们可以获取第三个元素并与它左侧的元素进行比较。这个过程将一直持续到我们对数组进行排序为止。
int[] a = {
    
     1, 2, 7, 6, 4, 9, 12 };

for (int m = 1; m < a.length; m++) {
    
    

  int n = m;

  while (n > 0 && a[n - 1] > a[n]) {
    
    

    int k = a[n];

    a[n] = a[n - 1];

    a[n - 1] = k;

    n--;

  }

}

29. 如何反转数组?

  • 循环直到数组的一半长度。
  • 从开头和结尾替换与索引对应的数字。
int[] a = {
    
     1, 2, 7, 6, 4, 9, 12 };

for (int t = 0; t < a.length / 2; t++) {
    
     

  int tmp = a[t]; 

  a[t] = a[a.length - t - 1]; 

  a[a.length - t- 1] = tmp; 

}

30. 如何在不使用第三个变量的情况下交换两个数字?

  • 声明两个变量并用值初始化它们。
  • 使 b 成为两个数字的总和。
  • 然后从 a 中减去总和 (b),因此现在交换 a。
  • 最后,从总和 (b) 中减去 a,因此 b 也被交换。
int a = 10;

int b = 20;

b = b + a; // now b is sum of both the numbers

a = b - a; // b - a = (b + a) - a = b (a is swapped)

b = b - a; // (b + a) - b = a (b is swapped)

31. 使用递归打印斐波那契数列?

  • 斐波那契数是以下整数序列中的数字:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …

  • 我们可以使用斐波那契递归函数中使用的数学公式来计算它们。
public static int fibonacci(int n) {
    
    

  if (n <= 1)

    return n;

  return fibonacci(n - 1) + fibonacci(n - 2);

}

public static void main(String args[]) {
    
    

  int n = 10;

  System.out.println(fibonacci(n));

}

32. 如何求整数的阶乘?

  • 阶乘是一个将一个数字乘以它下面的每个数字的函数。例如,5!= 54321=120。
  • 递归函数将数字乘以直到达到 1。
public static long factorial(long n) {
    
    

if (n == 1)

  return 1;

else

  return (n * factorial(n - 1));

}

33. 如何反转链表?

  • 声明一个链表。
  • 将元素添加到该链接列表。
  • 将降序迭代器方法应用于链表。
  • 这颠倒了链表中元素的顺序。
LinkedList<Integer> ll = new LinkedList<>();

ll.add(1);

ll.add(2);

ll.add(3);

System.out.println(ll);

LinkedList<Integer> ll1 = new LinkedList<>();

ll.descendingIterator().forEachRemaining(ll1::add);

System.out.println(ll1);

34. 你将如何实现二分搜索?

  • 二进制搜索在每个迭代步骤中将数组分成两半,直到找到元素。
  • 它适用于已排序的数组,因为它比较相邻元素的值,然后计算中间数。
  • 如果低值在任何时候变得大于高,则意味着该元素不存在于列表中。
int mid = (low + high) / 2;

while (low <= high) {
    
    

  if (arr[mid] < key) {
    
    

    low = mid + 1;

  } else if (arr[mid] == key) {
    
    

    return mid;

  } else {
    
    

    high = mid - 1;

  }

  mid = (low + high) / 2;

}

if (low > high) {
    
    

  return -1;

}

return -1;

35. 你如何找到数组中的第二大数?

  • 循环遍历数组。
  • 如果 i 的值大于最高值,则将 i 的值存储在最高值中,并将最高值的值存储在第二高的变量中。
private static int findSecondHighest(int[] array) {
    
    

  int highest = Integer.MIN_VALUE;

  int secondHighest = Integer.MIN_VALUE;

  for (int i : array) {
    
    

    if (i > highest) {
    
    

      secondHighest = highest;

      highest = i;

    } else if (i > secondHighest) {
    
    

      secondHighest = i;

    }

  }

  return secondHighest;

}

36. 如何从输入字符串中删除所有出现的给定字符?

  • 使用内置的字符串方法“replace”将一个字符替换为任何其他字符,包括符号和空格。
String str1 = "china";

str1 = str1.replace("a", "");

System.out.println(str1); 

37. 如何用代码展示继承?

  • Cat类通过继承父类(Animal)继承了Animal类的属性color。
  • 这样一个类 Cat 可以拥有更多的父类,如果它希望继承它们的属性。
class Animal {
    
    

  String color;

}

class Cat extends Animal {
    
    

  void meow() {
    
    

    System.out.println("Meow");

  }

}

38. 如何用代码展示重载和覆盖?

重载:

当一个类有两个或多个同名方法时,它们被称为重载方法。

class Foo {
    
    

  void print(String s) {
    
    

    System.out.println(s);

  }

  void print(String s, int count) {
    
    

    while (count > 0) {
    
    

      System.out.println(s);

      count--;

    }

  }

}

覆盖:

当子类中也实现了超类方法时,这是一种覆盖的情况。

class Base {
    
    

  void printName() {
    
    

    System.out.println("Base Class");

  }

}

class Child extends Base {
    
    

  @Override

  void printName() {
    
    

    System.out.println("Child Class");

  }

}

39. 你如何检查给定的数字是否是素数?

  • 使用 if 语句分别检查每个条件:

    • 如果数字是 0 或 1,则不能是素数。
    • 如果数字是2,它是质数。
    • 如果这个数不能被其他数整除,它就是质数。
public static boolean isPrime(int n) {
    
    

  if (n == 0 || n == 1) {
    
    

    return false;

  }

  if (n == 2) {
    
    

    return true;

  }

  for (int i = 2; i <= n / 2; i++) {
    
    

    if (n % i == 0) {
    
    

      return false;

    }

  }

  return true;

}

40. 如何对数组中的所有元素求和?

  • 使用 for 循环遍历数组并继续添加该数组中的元素。
int[] array = {
    
     1, 2, 3, 4, 5 };

int sum = 0;

for (int i : array)

  sum += i;

System.out.println(sum);

当我们为工作面试做好准备时,希望这些编程面试问题能够让我们更深入地了解我们可能遇到的问题类型。

猜你喜欢

转载自blog.csdn.net/weixin_42469135/article/details/127072112