对于JavaRush 学生来说,编程挑战、Java 和验证器是最好的朋友。然而,对于每个开发新手来说,有时您都需要开始走出常规,为自己制定一些小型项目,并为面试做准备。在面试中,你似乎应该遇到与课程中完全相同的 Java 实际问题。在大多数情况下这是事实,但有些公司喜欢问一些棘手的问题或一些不寻常的问题。为了避免在压力很大的面试中感到困惑,在家尝试自己解决此类 Java 问题很有用。
在本文中,我们将讨论其中六项棘手的任务。我们建议您首先阅读该情况并尝试自行解决。还有一件事:不要忘记每天解决课程中的 Java 问题!
Java 问题 - 1:从头开始创建无限循环
给定一段代码。完成它,使循环变得无限。class ToInfinity {
public static void main(String[] args) {
//впишите code сюда
for (int i = start; i <= start + 1; i++) {
/* тут должен быть бесконечный цикл, менять ничего нельзя*/
}
}
}
“没什么复杂的,”你说。您很可能不止一次地遇到这种情况:在解决 Java 问题时,您创建了一个无限循环,并思考如何摆脱它。恰恰相反。诀窍在于循环本身和退出循环的条件无法更改。只有两次迭代。然而,它们的数量足以创建无限循环。看起来它应该只适用于两次迭代,但可以通过使用溢出使其无限。你已经猜到怎么做了吗?
解决方案
由于溢出。是Java中可以存储的Integer.MAX_VALUE
最大值。int
如果达到Integer.MAX_VALUE
并增加该值,则会向下滚动到Integer.MIN_VALUE
,即滚动到最小值Integer
。因此,要解决这个 Java 问题,我们只需start
为变量分配一个比数据类型的最大值小 1 的值int
。 Java中的任务代码:
class ToInfinity {
public static void main(String[] args) {
int start = Integer.MAX_VALUE - 1;
for (int i = start; i <= start + 1; i++) {
//бесконечный цикл
System.out.println(i); //убеждаемся в бесконечности цикла
}
}
}
会发生什么?我们从 start=2147483645 (Integer.MAX_VALUE-1) 开始,在下一次迭代中,该值变为 2147483645,然后是 2147483646,然后是 -2147483648、-2147483647...等等。
Java任务-2.创建将被执行的注释
好吧,我们到了!从第一堂课开始,我们就听说评论不被执行。这就是他们评论的目的。我们认为这个问题的解决方案对于 Java 程序员来说并不总是显而易见的,即使是经验丰富的程序员也是如此。然而,有一种棘手的方法可以强制 Java 机器“合法”地运行注释来执行。你感觉到风从哪里吹来吗?猜猜看!解决方案
Java中解决该问题的代码:public class ExecutableComment {
public static void main(String[] args) {
// комментарий ниже будет выполнен!
// \u000d System.out.println("выполняемый комментарий");
}
}
如果我们在 IDE 中用 Java 键入此任务的代码,我们将得到以下结果:
выполняемый комментарий
原因是Java编译器将Unicod字符读取 \u000d
为换行,读取我们的代码如下: 编译器破译了Java中解决该问题的代码:
public class ExecutableComment {
public static void main(String[] args) {
// the line below this gives an output
// \u000d
System.out.println("comment executed");
}
}
Java 任务 - 3:创建命名循环
该系列的另一个代表作是“实际编程问题,真空中的 Java”。从某种意义上说,尚不清楚为什么这是必要的,循环不太可能因为它是非个人化的事实而感到冒犯。好吧,还有一点很重要:语言允许你给循环命名。解决方案
注意:对于某些人来说,这样的“名称”被称为“标签”,不建议在实践中使用。 用 Java 解决问题的代码,演示了命名循环public class NamedLoop {
public static void main(String[] args) {
loop1:
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (i == 3)
break loop1;
System.out.println("i = " + i + " j = " + j);
}
}
}
}
如果运行该程序,输出将如下所示:
i = 0 j = 0
i = 0 j = 1
i = 0 j = 2
i = 0 j = 3
i = 0 j = 4
i = 1 j = 0
i = 1 j = 1
i = 1 j = 2
i = 1 j = 3
i = 1 j = 4
i = 2 j = 0
i = 2 j = 1
i = 2 j = 2
i = 2 j = 3
i = 2 j = 4
在这里您还可以使用 continue 转到命名循环的开头。如果需要,您可以在嵌套的with循环中使用break
(或)来使用 分解多个循环。这将有助于避免设置大量标志并测试它们以确定是继续还是退出内循环。 continue
if-else
for
if-else
if-else
Java 问题 - 4. 关于整数数组中的唯一重复项
ArrayList
给定一个包含从 1 到 100的元素的整数数组(或,根据您的喜好) Integer
。该数组有且仅有一个重复元素。如何找到它?Java 程序员比前三个任务更熟悉此类任务。因为它不是关于了解几乎从未使用过的语言的微妙之处,而是关于逻辑。当你头脑清醒或者抱有“我是程序员,我很聪明”的态度时,第一个用暴力解决问题的肆无忌惮的冲动很快就会消失。唯一不好的是,在面试过程中,在压力下,这种情况可能不会发生。因此,在研究解决方案之前请先思考一下!
求解算法如下:
计算从 1 到 100 的所有数字的总和。我们认为您知道如何执行此操作(例如,使用著名的高斯方法)。现在计算数组 或 的元素的总和ArrayList’а
。并且...从第二个金额中减去第一个金额。答对了!结果数字是重复元素的值。 的 Java 问题解决方案代码ArrayList
。
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class FindDuplicate {
private static void findDuplicate(List<Integer> elements) {
//находим сумму всех уникальных элементов списка
int distinctSum = elements.stream().distinct().mapToInt(e -> e).sum();
//находим сумму всех элементов списка
int totalSum = elements.stream().mapToInt(e -> e).sum();
System.out.println("Элемент, который повторяется : " + (totalSum - distinctSum));
}
public static void main(String[] args) {
//создаем список последовательных элементов на промежутке [1..101).
List <Integer> elements = IntStream.range(1, 101).boxed().collect(Collectors.toList());
//устанавливаем элементу с индексом 53 meaning 23
elements.set(53, 23);
findDuplicate(elements);
}
}
另一种解决方案
import java.util.List;
import java.util.ArrayList;
public class Duplicate {
public int findDuplicateNumber(List<Integer> numbers) {
int highestNumber = numbers.size() - 1;
int total = getSum(numbers);
int duplicate = total - (highestNumber * (highestNumber + 1) / 2);
return duplicate;
}
public int getSum(List<Integer> numbers) {
int sum = 0;
for (int num : numbers) {
sum = sum + num;
}
return sum;
}
public static void main(String a[]) {
List <Integer> numbers = new ArrayList <Integer>();
for (int i = 1; i < 100; i++) {
numbers.add(i);
}
//добавляем дубликат в список
numbers.add(25);
Duplicate dn = new Duplicate();
System.out.println("Элемент, который повторяется: " + dn.findDuplicateNumber(numbers));
}
}
Java 问题 - 5. 关于整数数组中的非唯一重复项
如果上一个问题对您来说太简单了,那么请尝试解决以下问题:给定一张从 1 到 100 的整数。它包含重复项(多个)。如何查找出现多次的元素(查找元素本身并指出它出现了多少次)?解决方案
这里最合乎逻辑的解决方案是使用诸如 之类的结构HashMap
,因为它以键值对的形式存储数据。 解决Java问题的代码:
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class SomeDuplicates {
private static void findDuplicates(List<Integer> elements) {
HashMap <Integer, Integer > duplicates = new HashMap < >();
//заполняем Map duplicates значениями по принципу:
// ключ – meaning element, meaning – сколько раз он встречается
elements.forEach(e -> duplicates.put(e, duplicates.get(e) == null ? 1 : duplicates.get(e) + 1));
//из duplicates убираем все элементы, которые встретorсь не более 1 раза,
//и сохраняем //результат в список (для удобства обработки на следующем шаге)
List <Map.Entry <Integer, Integer> >
result = duplicates.entrySet().stream().filter(d -> d.getValue() > 1).collect(Collectors.toList());
//выводим результат для всех элементов в списке result
result.forEach(e -> System.out.println(String.format("Элемент %d встречается %d раз", e.getKey(), e.getValue())));
}
public static void main(String[] args) {
List <Integer> elements = IntStream.range(1, 101).boxed().collect(Collectors.toList());
elements.set(97, 23);
elements.set(27, 51);
elements.set(99, 23);
findDuplicates(elements);
}
}
GO TO FULL VERSION