楼主: 匿名
跳转到指定楼层
上一主题 下一主题
收起左侧

关于亚麻OA2 Nearest City和Smallest Negative Balance

🔗
Zbeeee 2020-12-16 09:46:30 | 只看该作者
全局:
您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
回复

使用道具 举报

地里匿名用户
🔗
匿名用户-FOHLQ  2020-12-16 10:40:07
您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
回复

使用道具 举报

🔗
Zbeeee 2020-12-16 10:59:11 | 只看该作者
全局:
您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
回复

使用道具 举报

地里匿名用户
🔗
匿名用户-FOHLQ  2020-12-16 12:15:01
本帖最后由 匿名 于 2020-12-16 12:27 编辑

[quote]匿名者 发表于 2020-12-16 09:02
第一题最近城市,用TreeMap:
  1. String[] findNearestCities(String[] ns,          ...[/quote]
  2. 终于搞定第一题:

  3. [code]  public String[] findNearestCities(int numOfPoints,
  4.                                  String[] ns,
  5.                                  int[] xs,
  6.                                  int[] ys,
  7.                                  int numOfQueries,
  8.                                  String[] qs) {
  9.         TreeMap<Integer,TreeMap<Integer, List<String>>> xyMap=new TreeMap<>();
  10.         TreeMap<Integer,TreeMap<Integer,List<String>>> yxMap=new TreeMap<>();
  11.         Map<String,int[]> npMap=new HashMap<>();
  12.         int size=ns.length;
  13.         for(int i=0;i<size;i++){
  14.             int x=xs[i];
  15.             int y=ys[i];
  16.             String n=ns[i];
  17.             TreeMap<Integer,List<String>> yMap=xyMap.getOrDefault(x,new TreeMap<>());
  18.             List<String> tmp1=yMap.getOrDefault(y,new ArrayList<>());
  19.             tmp1.add(n);
  20.             yMap.put(y,tmp1);
  21.             xyMap.put(x,yMap);
  22.             TreeMap<Integer,List<String>> xMap=yxMap.getOrDefault(y,new TreeMap<>());
  23.             List<String> tmp2=xMap.getOrDefault(x,new ArrayList<>());
  24.             tmp2.add(n);
  25.             xMap.put(x,tmp2);
  26.             yxMap.put(y,xMap);
  27.             npMap.put(n,new int[]{x,y});
  28.         }
  29.         String[] dest=new String[qs.length];
  30.         for(int i=0;i<qs.length;i++) {
  31.             String n=qs[i];
  32.             int[] p=npMap.get(n);
  33.             if(p==null) continue;

  34.             // check the same x
  35.             TreeMap<Integer,List<String>> yMap=xyMap.get(p[0]);
  36.             List<String> same=yMap.get(p[1]);
  37.             if (same.size()>1) {
  38.                 for(String str:same) {
  39.                     if(str.equals(n)) continue;
  40.                     if(dest[i]==null||str.compareTo(dest[i])<0) dest[i]=str;
  41.                 }
  42.                 continue;
  43.             }

  44.             int min=Integer.MAX_VALUE;
  45.             List<String> cities=new ArrayList<>();

  46.             Map.Entry<Integer,List<String>> lowerY=yMap.lowerEntry(p[1]);
  47.             if(lowerY!=null) {
  48.                 min=p[1]-lowerY.getKey();
  49.                 cities.addAll(lowerY.getValue());
  50.             }

  51.             Map.Entry<Integer,List<String>> higherY=yMap.higherEntry(p[1]);
  52.             if(higherY!=null) {
  53.                 if(higherY.getKey()-p[1]<min) {
  54.                     min=higherY.getKey()-p[1];
  55.                     cities.clear();
  56.                     cities.addAll(higherY.getValue());
  57.                 } else if(higherY.getKey()-p[1]==min) {
  58.                     cities.addAll(higherY.getValue());
  59.                 }
  60.             }

  61.             // check the same y
  62.             TreeMap<Integer,List<String>> xMap=yxMap.get(p[1]);

  63.             Map.Entry<Integer,List<String>> lowerX=xMap.lowerEntry(p[0]);
  64.             if(lowerX!=null) {
  65.                 if(p[0]- lowerX.getKey()<min) {
  66.                     min=p[0]- lowerX.getKey();
  67.                     cities.clear();
  68.                     cities.addAll(lowerX.getValue());
  69.                 } else if(p[0]- lowerX.getKey()==min) {
  70.                     cities.addAll(lowerX.getValue());
  71.                 }
  72.             }

  73.             Map.Entry<Integer,List<String>> higherX=xMap.higherEntry(p[0]);
  74.             if(higherX!=null) {
  75.                 if(higherX.getKey()-p[0]<min) {
  76.                     min=higherX.getKey()-p[0];
  77.                     cities.clear();
  78.                     cities.addAll(higherX.getValue());
  79.                 } else if (higherX.getKey()-p[0]==min) {
  80.                     cities.addAll(higherX.getValue());
  81.                 }
  82.             }

  83.             if(!cities.isEmpty()) {
  84.                 dest[i]=cities.get(0);
  85.                 for(String city:cities){
  86.                     if(dest[i].compareTo(city)>0) dest[i]=city;
  87.                 }
  88.             }
  89.         }
  90.         return dest;
  91.     }
复制代码


[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]

评分

参与人数 2大米 +3 收起 理由
elainewu5 + 1 给你点个赞!
tanlion + 2 给你点个赞!

查看全部评分

回复

使用道具 举报

地里匿名用户
🔗
匿名用户-FOHLQ  2020-12-16 12:29:38
第二题看错题了。最小负债和我们中文的理解不一样。应该是最大负债。汗一个。而且忘了最后排序。更新后的代码如下:
  1.     List<String> minimumDebtMembers(List<debtRecord> records) {
  2.         Map<String,Integer> debts=new HashMap<>();
  3.         for(debtRecord record:records) {
  4.             String borrower=record.borrower;
  5.             String lender=record.lender;
  6.             int amount=record.amount;
  7.             debts.put(borrower, debts.getOrDefault(borrower,0)-amount);
  8.             debts.put(lender, debts.getOrDefault(lender,0)+amount);
  9.         }
  10.         List<String> dest=new ArrayList<>();
  11.         int minDebt=Integer.MAX_VALUE;
  12.         for(Map.Entry<String,Integer> entry:debts.entrySet()) {
  13.             if (entry.getValue()>=0||entry.getValue()>minDebt) continue;
  14.             if(entry.getValue()<minDebt) {
  15.                 minDebt=entry.getValue();
  16.                 dest.clear();
  17.             }
  18.             dest.add(entry.getKey());
  19.         }
  20.         Collections.sort(dest);
  21.         if (dest.isEmpty()) dest.add("Nobody has a negative balance");
  22.         return dest;
  23.     }
复制代码


回复

使用道具 举报

🔗
cerealkiller 2020-12-16 15:30:12 | 只看该作者
全局:
Zbeeee 发表于 2020-12-16 10:59
我也觉得第二题可以Heap和HashMap, 但你看下面的同学给的方法,好像不排序,直接O(N)也可以?就是再遍历 ...

nearest cities 后来有runtime error 那道题我放弃了
回复

使用道具 举报

🔗
cerealkiller 2020-12-16 15:34:00 | 只看该作者
全局:
匿名者 发表于 2020-12-16 12:29
第二题看错题了。最小负债和我们中文的理解不一样。应该是最大负债。汗一个。而且忘了最后排序。更新后的代 ...
  1. import java.util.*;
  2. import java.io.*;
  3. import java.lang.*;

  4. public class Solution {
  5.     List<String> minimumDebtMembers(List<debtRecord> records){
  6.         if(records == null) return new ArrayList<>();
  7.         
  8.         HashMap<String, Integer> map = new HashMap<>();
  9.         
  10.         for(debtRecord record : records){
  11.             String borrower = record.borrower;
  12.             String lender = record.lender;
  13.             int amount = record.amount;
  14.             map.put(borrower, map.getOrDefault(borrower, 0)-amount);
  15.             map.put(lender, map.getOrDefault(lender, 0)+amount);
  16.         }
  17.         
  18.         PriorityQueue<Map.Entry<String, Integer>> heap = new PriorityQueue<>((a,b) -> a.getValue()==b.getValue() ?
  19.             a.getKey().compareTo(b.getKey()) : a.getValue()-b.getValue());
  20.             
  21.         for(Map.Entry<String, Integer> entry : map.entrySet()){
  22.             if(entry.getValue()<0){
  23.                 heap.add(entry);
  24.             }
  25.         }
  26.         
  27.         List<String> result = new ArrayList<>();
  28.         if(!heap.isEmpty()){
  29.             int min = heap.peek().getValue();
  30.             while(!heap.isEmpty() && heap.peek().getValue() == min){
  31.                 result.add(heap.poll().getKey());
  32.             }
  33.         }
  34.         if(result.size()==0) result.add("Nobody has a negative balance");
  35.         
  36.         return result;
  37.     }
  38. }
复制代码


我是这么写的,这个逻辑难道有问题?
回复

使用道具 举报

地里匿名用户
🔗
匿名用户-FOHLQ  2020-12-17 00:18:57
cerealkiller 发表于 2020-12-16 15:34
[mw_shl_code=java,true]import java.util.*;
import java.io.*;
import java.lang.*;

这个用了排序,时间复杂度太高了。问题就在于O(N)的题被答成O(NLogN)。
回复

使用道具 举报

🔗
cerealkiller 2020-12-17 06:55:18 | 只看该作者
全局:
您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
回复

使用道具 举报

🔗
Mel_Mellow 2020-12-17 09:05:35 | 只看该作者
全局:
cerealkiller 发表于 2020-12-17 06:55
能不能解释一下如何O(N)? 如果用只用ArrayList, 那一步 Collections.sort(list) 也是O(NLogN)了呀,这道 ...

一个Arraylist找最大,只要从头到尾撸一遍,看看哪个最大就好了,不需要排序,O(N)

评分

参与人数 1大米 +3 收起 理由
格林匹施ZELQ + 3 欢迎分享你知道的情况,会给更多积分奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表