同行者科技笔试面经

xiaojiuaigc@163.com 发布于 2024-11-12 783 次阅读


面的都不算难考察你基础,和之前面小米比太简单了

第一道题是在不使用split关键字的情况下分割字符不算难考验你基础

package cn.ck;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String s = sc.nextLine();
String delimiter ="&&";
String[] split = stSplit(s, "&&");
for (String string : split) {
System.out.println(string);
}
System.out.println(addString(split,delimiter));

}

/**
* 拆分字符串
* @param s
* @param delimiter
* @return
*/

public static String[] stSplit(String s, String delimiter){


List<String> result = new ArrayList<>();
int start = 0;
int end = s.indexOf(delimiter);

while (end != -1) {
result.add(s.substring(start, end));
start = end + delimiter.length();
end = s.indexOf(delimiter, start);
}


result.add(s.substring(start));

return result.toArray(new String[0]);
}

/**
* 合并
* @param split
* @param delimiter
* @return
*/
public static String addString(String[] split, String delimiter){
if (split.length<0){
return "";
}
if (split.length==1){
return split[0];
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < split.length; i++) {
if (i!=split.length-1){
sb=sb.append(split[i]).append(delimiter);
}else {
sb=sb.append(split[i]);
}

}
return sb.toString();
}


}

}

第二道是找不同的数字

我们可以使用HashMap的

getOrDefault也不算难但是不知道为什么写这道题浪费了很长的时间
package cn.ck;


import java.util.HashMap;
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main1 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int[] arr=new int[1000];
for (int i = 0; i <arr.length ; i++) {
arr[i]=sc.nextInt();
}
//找到相同的数字
int i=findSame(arr);
}

/**
* 找到相同数字
* @param arr
* @return
*/
private static int findSame(int[] arr) {

HashMap<Integer, Integer> map = new HashMap<>();
for (int i : arr) {
map.put(i,map.getOrDefault(i,0)+1);
if (map.get(i)==2){
return i;
}

}
return -1;
}


}


第三道题是有26个字母a-z,找出所有字母的组合,a、b、c、ab、abc、ac、a~z都是一个组合(顺序无关)

当时我用了递归(执行的话得运算2^26内存放不下)

package cn.ck;

import java.util.ArrayList;
import java.util.List;

public class Main3 {
public static void main(String[] args) {
List<String> combination = getAllCombination("", 'a', 'z');
for (String s1 : combination) {
System.out.println(s1);
}
}

/**
* 递归获取所有可能情况
* @param s
* @param begin
* @param end
* @return
*/
private static List<String> getAllCombination(String s, char begin, char end) {
List<String> result = new ArrayList<>();

if (begin > end) {
result.add(s); // 添加当前生成的组合前缀
return result;
}

// 不包含当前字符的组合
result.addAll(getAllCombination(s, (char) (begin + 1), end));

// 包含当前字符的组合
result.addAll(getAllCombination(s + begin, (char) (begin + 1), end));

return result;
}
}

第四道题是考你多线程和锁的知识还好前几天看了Synchronizeed要不然就G了

package cn.ck;

public class Main4 {
private static final int MAX_NUMBER = 200;
private static final Object lock = new Object();
private static volatile boolean firstTurn = true; // 控制线程交替的标志
public static void main(String[] args) {
Thread thread1 = new Thread(() -> printNumbers(0, "Thread 1"));
Thread thread2 = new Thread(() -> printNumbers(1, "Thread 2"));

thread1.start();
thread2.start();
}

/**
*
* @param start
* @param name
*/
private static void printNumbers(int start, String name) {
for (int i = start; i <= MAX_NUMBER; i += 2) {
synchronized (lock) {
while ((i % 2 == 0) != firstTurn) {
try {
lock.wait();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return;
}
}
System.out.println(name + ": " + i);
firstTurn = !firstTurn;
lock.notify();
}
}
}
}

第五道题是一个SQL题难度适中题目呢我忘了。