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

简介: 【面试专题】总结记录40个数据结构与算法的常见问题(下)

正文


编程面试题


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


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


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);

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


文章知识点与官方知识档案匹配,可进一步学习相关知识

相关文章
|
6天前
|
存储 算法 编译器
米哈游面试算法题:有效的括号
米哈游面试算法题:有效的括号
29 0
|
6天前
|
开发框架 算法 搜索推荐
C# .NET面试系列九:常见的算法
#### 1. 求质数 ```c# // 判断一个数是否为质数的方法 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 Progr
66 1
|
6天前
|
负载均衡 算法 应用服务中间件
面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
字节跳动面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
50 0
|
1天前
|
Python
2024年最新【Python】循环结构:while 循环(1),阿里巴巴面试常见问题及回答技巧
2024年最新【Python】循环结构:while 循环(1),阿里巴巴面试常见问题及回答技巧
2024年最新【Python】循环结构:while 循环(1),阿里巴巴面试常见问题及回答技巧
|
4天前
|
算法 Java API
Groovy脚本基础全攻略,android面试算法题
Groovy脚本基础全攻略,android面试算法题
|
4天前
|
NoSQL 算法 Java
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
|
4天前
|
算法 架构师 网络协议
对标腾讯T9架构师的 Android 面试题新鲜出炉,算法真的太重要了
对标腾讯T9架构师的 Android 面试题新鲜出炉,算法真的太重要了
|
4天前
|
移动开发 算法 搜索推荐
2024最新Android算法相关面试大全,请查收
2024最新Android算法相关面试大全,请查收
|
6天前
|
存储 缓存 算法
面试遇到算法题:实现LRU缓存
V哥的这个实现的关键在于维护一个双向链表,它可以帮助我们快速地访问、更新和删除最近最少使用的节点,同时使用哈希表来提供快速的查找能力。这样,我们就可以在 O(1) 的时间复杂度内完成所有的缓存操作。哈哈干净利索,回答完毕。
|
6天前
|
算法 搜索推荐 大数据
数据结构面试常见问题
V哥在工作中整理了22个常用数据结构实现与原理分析,在面试中可以帮你你充分准备