每日一练72——Java找出两个物体之间的重力(8kyu)

题目

你的工作是找到两个球形物体(obj1,obj2)之间的引力。

输入

给出两个数组:

arr_val(值数组)由3个元素组成
元素1:obj 1的质量
元素2:obj 2的质量
元素3:中心之间的距离
arr_unit(单元数组)由3个元素组成
元素1:obj 1的质量单位
元素2:obj 2的质量单位
元素3:中心之间距离的单位

质量单位是:
千克(kg)
克(g)
毫克(mg)
微克(μg)
磅(lb)

距离单位是:
米(m)
厘米(cm)
毫米(mm)
千分尺(μm)
英尺(ft)

注意
值G = 6.67 x 10-11Nkg–2m2

1英尺 = 0.3048米

1磅 = 0.453592千克

返回值必须符合牛顿定律(显然)

μ 从此处复制此内容以在解决方案中使用它。

测试用例:

import static org.junit.Assert.assertEquals;
import org.junit.Test;

public class SampleTestCases {

  private static void test(double expected, double[] arrVal, String[] arrUnit) {
    assertEquals(expected, Solution.solution(arrVal, arrUnit), expected * 1e-5);
  }

  @Test
  public void sampleTests() {
    test(6.67e-12, new double[] {1000, 1000, 100}, new String[] {"g", "kg", "m"});
    test(6.67e-9, new double[] {1000, 1000, 100}, new String[] {"kg", "kg", "m"});
    test(0.0000667, new double[] {1000, 1000, 100}, new String[] {"kg", "kg", "cm"});
  }

}

解题

My

思路:判断单位后换算标准单位再计算,感觉好长,看看其他人有没有啥好方法。

public class Solution {

  public static double solution(double[] arrVal, String[] arrUnit) {
        final double G = 6.67e-11;

        if ("g".equals(arrUnit[0])) {
            arrVal[0] *= 1e-3;
        } else if ("mg".equals(arrUnit[0])) {
            arrVal[0] *= 1e-6;
        } else if ("μg".equals(arrUnit[0])) {
            arrVal[0] *= 1e-9;
        } else if ("lb".equals(arrUnit[0])) {
            arrVal[0] *= 0.453592;
        }

        if ("g".equals(arrUnit[1])) {
            arrVal[0] *= 1e-3;
        } else if ("mg".equals(arrUnit[1])) {
            arrVal[1] *= 1e-6;
        } else if ("μg".equals(arrUnit[1])) {
            arrVal[1] *= 1e-9;
        } else if ("lb".equals(arrUnit[1])) {
            arrVal[1] *= 0.453592;
        }

        if ("cm".equals(arrUnit[2])) {
            arrVal[2] *= 1e-2;
        } else if ("mm".equals(arrUnit[2])) {
            arrVal[2] *= 1e-3;
        } else if ("μm".equals(arrUnit[2])) {
            arrVal[2] *= 1e-6;
        } else if ("ft".equals(arrUnit[2])) {
            arrVal[2] *= 0.3048;
        }
        return G * arrVal[0] * arrVal[1] / (arrVal[2] * arrVal[2]);
  }

}

Other

我发现挺简洁的两个。

import java.util.HashMap;
import java.util.Map;

public class Solution {

    private final static Double G = 6.67e-11;

    public static double solution(double[] arrVal, String[] arrUnit) {
        Map<String, Double> convertions = new HashMap<>();
        convertions.put("kg", 1.0);
        convertions.put("g", 1e-3);
        convertions.put("mg", 1e-6);
        convertions.put("μg", 1e-9);
        convertions.put("lb", 0.453592);
        convertions.put("m", 1.0);
        convertions.put("cm", 1e-2);
        convertions.put("mm", 1e-3);
        convertions.put("μm", 1e-6);
        convertions.put("ft", 0.3048);

        double m1 = arrVal[0] * convertions.get(arrUnit[0]);
        double m2 = arrVal[1] * convertions.get(arrUnit[1]);
        double r = arrVal[2] * convertions.get(arrUnit[2]);

        return G * m1 * m2 / r / r;
    }

}
import java.util.*;
public class Solution {

   public static double solution(double[] arrVal, String[] arrUnit) {
        Map<String, Double>massUnits = new HashMap<>();
        massUnits.put("kg",1d);
        massUnits.put("g",1/1000d);
        massUnits.put("mg",1/1000000d);
        massUnits.put("μg",1/1000000000d);
        massUnits.put("lb",0.453592);
        Map<String, Double>distancenits = new HashMap<>();
        distancenits.put("m",1d);
        distancenits.put("cm",1/100d);
        distancenits.put("mm",1/1000d);
        distancenits.put("μm",1/1000000d);
        distancenits.put("ft",0.3048);
       return 6.67e-11*(arrVal[0]*massUnits.get(arrUnit[0])*arrVal[1]*massUnits.get(arrUnit[1]))/(arrVal[2]*arrVal[2]*distancenits.get(arrUnit[2])*distancenits.get(arrUnit[2]));
    }

}

我发现挺复杂的解法o(╯□╰)o

public class Solution {
  private static final double KG_TO_LB = 1.0d / 0.453592d;
  private static final double LB_TO_KG = 0.453592d;
  
  private static final double M_TO_FT = 1.0d / 0.3048d;
  private static final double FT_TO_M = 0.3048d;
  
  private static final double GRAVITATIONAL_FORCE = 6.67d * Math.pow(10, -11);

  public static double solution(double[] arrVal, String[] arrUnit) {
    double m1 = massConvertToUnit(arrVal[0], arrUnit[0], "kg"), m2 = massConvertToUnit(arrVal[1], arrUnit[1], "kg");
    double r = distanceConvertToUnit(arrVal[2], arrUnit[2], "m");
    
    return GRAVITATIONAL_FORCE * ((m1 * m2) / Math.pow(r, 2));
  }
  
  private static double massConvertToUnit(double value, String fromUnit, String toUnit) {
    if(fromUnit.equals(toUnit))
      return value;
    
    return value * getMassConvertNumber(fromUnit, toUnit);
  }
  
  private static double distanceConvertToUnit(double value, String fromUnit, String toUnit) {
    if(fromUnit.equals(toUnit))
      return value;
    
    return value * getDistanceConvertNumber(fromUnit, toUnit);
  }
  
  private static double getMassConvertNumber(String fromUnit, String toUnit) {
    switch(fromUnit) {
      case "kg":
        switch(toUnit) {
          case "g":
            return 1_000.0d;
          case "mg":
            return 1_000_000.0d;
          case "μg":
            return 1_000_000_000.0d;
          case "lb":
            return KG_TO_LB;
        }
      case "g":
        switch(toUnit) {
          case "kg":
            return 1.0d / 1_000.0d;
          case "mg":
            return 1_000.0d;
          case "μg":
            return 1_000_000.0d;
          case "lb":
            return KG_TO_LB * (1.0d / 1_000.0d);
        }
      case "mg":
        switch(toUnit) {
          case "kg":
            return 1.0d / 1_000_000.0d;
          case "g":
            return 1.0d / 1_000.0d;
          case "μg":
            return 1_000.0d;
          case "lb":
            return KG_TO_LB * (1.0d / 1_000_000.0d);
        }
      case "μg":
        switch(toUnit) {
          case "kg":
            return 1.0d / 1_000_000_000.0d;
          case "g":
            return 1.0d / 1_000_000.0d;
          case "mg":
            return 1_000_000.0d;
          case "lb":
            return KG_TO_LB * (1.0d / 1_000_000_000.0d);
        }
      case "lb":
        switch(toUnit) {
          case "kg":
            return LB_TO_KG;
          case "g":
            return LB_TO_KG / 1_000.0d;
          case "mg":
            return LB_TO_KG / 1_000_000.0d;
          case "μg":
            return LB_TO_KG / 1_000_000_000.0d;
        }
    }
    
    return 1.0d;
  }
  
  private static double getDistanceConvertNumber(String fromUnit, String toUnit) {
    switch(fromUnit) {
      case "m":
        switch(toUnit) {
          case "cm":
            return 100.0d;
          case "mm":
            return 1_000.0d;
          case "μm":
            return 1_000_000.0d;
          case "ft":
            return M_TO_FT;
        }
      case "cm":
        switch(toUnit) {
          case "m":
            return 1.0d / 100.0d;
          case "mm":
            return 10.0d;
          case "μm":
            return 10_000.0d;
          case "ft":
            return M_TO_FT * (1.0d / 100.0d);
        }
      case "mm":
        switch(toUnit) {
          case "m":
            return 1.0d / 1_000.0d;
          case "cm":
            return 1.0d / 10.0d;
          case "μm":
            return 1_000.0d;
          case "ft":
            return M_TO_FT * (1.0d / 1_000.0d);
        }
      case "μm":
        switch(toUnit) {
          case "m":
            return 1.0d / 1_000_000.0d;
          case "cm":
            return 1.0d / 10_000.0d;
          case "mm":
            return 1.0d / 1_000.0d;
          case "ft":
            return M_TO_FT * (1.0d / 1_000_000.0d);
        }
      case "ft":
        switch(toUnit) {
          case "m":
            return FT_TO_M;
          case "cm":
            return FT_TO_M * (1.0d / 100.0);
          case "mm":
            return FT_TO_M * (1.0d / 1_000.0);
          case "μm":
            return FT_TO_M * (1.0d / 1_000_000.0);
        }
    }
    
    return 1.0d;
  }
}

还有用switch简单点的解法:

public class Solution {

    public static double solution(double[] arrVal, String[] arrUnit) {
        double mass1 = arrVal[0] * massUnit(arrUnit[0]);
        double mass2 = arrVal[1] * massUnit(arrUnit[1]);
        double distance = arrVal[2] * distanceUnit(arrUnit[2]);
        double force = G * mass1 * mass2 / distance / distance;
        return force;
    }
    
    static final double G = 6.67e-11;

    static double massUnit(String unit) {
        switch (unit) {
        case "μg": return 1e-9;
        case "mg": return 1e-6;
        case "g": return 1e-3;
        case "kg": return 1.0;
        case "lb": return 0.453592;
        default:
            throw new IllegalArgumentException("Unknown mass unit: " + unit);
        }
    }

    static double distanceUnit(String unit) {
        switch (unit) {
        case "μm": return 1e-6;
        case "mm": return 1e-3;
        case "cm": return 1e-2;
        case "m": return 1.0;
        case "ft": return 0.3048;
        default:
            throw new IllegalArgumentException("Unknown distance unit: "
                                               + unit);
        }
    }

}

后记

这题总结下有if、switch还是map解题思路。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,138评论 0 13
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,457评论 1 45
  • 李老师是我们的班主任,
    5525曾健阅读 204评论 0 1
  • 星期五,晴 早上老牛起床丸子已拉完,拉对了,就是尿在外面一点。 昨天晚上又提起要把小狗送人的事,老牛同意了,小羊跟...
    白罗汉阅读 221评论 0 0
  • 我愿,愿,这个字多好呀!上原下心。原谅,这世间一切的伤心。 01 世间所有的好姑娘,都会被世界温柔以待。 以前我对...
    七米霞阅读 3,816评论 43 105