面试题教我做人?
58同城面试题
给定一个数组,你需要删除其中重复出现的元素,只保留最后一次出现的重复元素,使得每个元素只出现一次,返回新数组,并保证新数组中的元素顺序与原数组一致。
为数不多的直接题,哭~
import java.util.*;
public class Solution {
/**
* 删除重复元素
* @param array int整型一维数组
* @return int整型一维数组
*/
public int[] removeDuplicate (int[] array) {
// write code here
HashMap<Integer, Integer> map = new HashMap<>();
for(int i = 0; i < array.length; i++){
map.put(array[i], i);
}
int[] res = new int[map.size()];
int index = 0;
for(int i = 0; i < array.length; i++){
if(map.get(array[i]) == i){
res[index++] = array[i];
}
}
return res;
}
}
如何保证原有的顺序又实现题干要求的功能呢?利用HashMap来做可以说是非常巧妙了!!再配上下面这个逻辑真是优雅中的优雅!
if(map.get(array[i]) == i)
res[index++] = array[i];
某企业在年终给优秀同学发放奖品时需要排队领取,由于男同学和女同学发放的奖品不同,为了提高发放效率,需要在发放奖品前先将队伍中的男同学排到一起,女同学排到一起。
排队调换规则:只能挨个调换位置,不能跨越调换。
我们用B字母代表男同学,用G字母代表女同学,输入一行只包含B和G的字符串(即男女同学排队领取奖品),使用你熟悉语言编程的方式计算出最少需要多少次调换才能将男同学和女同学分开排好吗?
class Main {
public int lineup(String peoples) {
//计算女生排在前面的代价
int preGirl = -1, cost1 = 0;
int n = peoples.length();
for (int i = 0; i < n; i++) {
if (peoples.charAt(i) == 'G')
if (preGirl < i - 1) {
cost1 += i - preGirl - 1;
preGirl = i;
}
}
//计算男生排在前面的代价
int preBoy = -1, cost2 = 0;
for (int i = 0; i < n; i++) {
if (peoples.charAt(i) == 'G')
if (preBoy < i - 1) {
cost2 += i - preBoy - 1;
preBoy = i;
}
}
return cost1 >= cost2 ? cost2 : cost1;
}
}
关键点:1.两种情况《男前女后》《男后女前》
2.利用preBoy 和 当前指针处(preGirl和当前指针处)的差值确定却要进行对换的次数
对给定的二叉树依次完成前序,中序,后序遍历,并输出遍历结果。
每行输入为一个二叉树,一维数组形式。其中-1表示Nil节点。
结果以二维数组形式输出(前序,中序,后序遍历的结果),其中Nil节点不用输出。
import java.util.*;
public class Solution {
/**
* 对给定的二叉树依次完成前序,中序,后序遍历,并输出遍历结果
* @param input int整型一维数组 -1表示Nil节点
* @return int整型ArrayList<ArrayList<>>
*/
ArrayList<Integer> preSeq = new ArrayList<>();
ArrayList<Integer> inSeq = new ArrayList<>();
ArrayList<Integer> postSeq = new ArrayList<>();
public ArrayList<ArrayList<Integer>> binaryTreeScan (int[] input) {
// write code here
preOrder(input, 0);
inOrder(input, 0);
postOrder(input, 0);
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
res.add(preSeq);
res.add(inSeq);
res.add(postSeq);
return res;
}
private void preOrder(int[] nums, int root) {
if(root >= nums.length){
return;
}
if(nums[root] != -1){
preSeq.add(nums[root]);
}
preOrder(nums, (root << 1)|1);
preOrder(nums, (root << 1) + 2);
}
private void inOrder(int[] nums, int root) {
if(root >= nums.length){
return;
}
inOrder(nums, (root << 1)|1);
if(nums[root] != -1){
inSeq.add(nums[root]);
}
inOrder(nums, (root << 1) + 2);
}
private void postOrder(int[] nums, int root) {
if(root >= nums.length){
return;
}
postOrder(nums, (root << 1)|1);
postOrder(nums, (root << 1) + 2);
if(nums[root] != -1){
postSeq.add(nums[root]);
}
}
}