【面试专题】总结记录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);

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


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

相关文章
|
3月前
|
负载均衡 NoSQL 算法
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
这篇文章是关于Java面试中Redis相关问题的笔记,包括Redis事务实现、集群方案、主从复制原理、CAP和BASE理论以及负载均衡算法和类型。
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
|
3月前
|
Java
【Java集合类面试二十六】、介绍一下ArrayList的数据结构?
ArrayList是基于可动态扩展的数组实现的,支持快速随机访问,但在插入和删除操作时可能需要数组复制而性能较差。
|
3月前
|
算法 Go
[go 面试] 雪花算法与分布式ID生成
[go 面试] 雪花算法与分布式ID生成
|
1月前
|
算法 Java 数据库
美团面试:百亿级分片,如何设计基因算法?
40岁老架构师尼恩分享分库分表的基因算法设计,涵盖分片键选择、水平拆分策略及基因法优化查询效率等内容,助力面试者应对大厂技术面试,提高架构设计能力。
美团面试:百亿级分片,如何设计基因算法?
|
1月前
|
算法 前端开发 Java
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
这篇文章总结了单链表的常见面试题,并提供了详细的问题分析、思路分析以及Java代码实现,包括求单链表中有效节点的个数、查找单链表中的倒数第k个节点、单链表的反转以及从尾到头打印单链表等题目。
32 1
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
|
30天前
|
算法 Java 数据库
美团面试:百亿级分片,如何设计基因算法?
40岁老架构师尼恩在读者群中分享了关于分库分表的基因算法设计,旨在帮助大家应对一线互联网企业的面试题。文章详细介绍了分库分表的背景、分片键的设计目标和建议,以及基因法的具体应用和优缺点。通过系统化的梳理,帮助读者提升架构、设计和开发水平,顺利通过面试。
美团面试:百亿级分片,如何设计基因算法?
|
1月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
67 2
|
18天前
|
存储 NoSQL Redis
Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList
String类型底层数据结构,List类型全面解析,ZSet底层数据结构;简单动态字符串SDS、压缩列表ZipList、哈希表、跳表SkipList、整数数组IntSet
|
2月前
|
机器学习/深度学习 JavaScript 算法
面试中的网红虚拟DOM,你知多少呢?深入解读diff算法
该文章深入探讨了虚拟DOM的概念及其diff算法,解释了虚拟DOM如何最小化实际DOM的更新,以此提升web应用的性能,并详细分析了diff算法的实现机制。
|
3月前
|
消息中间件 存储 算法
这些年背过的面试题——实战算法篇
本文是技术人面试系列实战算法篇,面试中关于实战算法都需要了解哪些内容?一文带你详细了解,欢迎收藏!