趋势科技第一题

图片说明
借用下群里老哥发的题图

import java.util.Scanner;

public class Adder {
    // please don't modify any code below.
    public static void main(String[] args) {
//        Scanner sc = new Scanner(System.in);

//        String num1 = sc.nextLine();
//        String num2 = sc.nextLine();


        String num1 = "199.999";
        String num2 = "0.001";
        String sum = add(num1, num2);
        System.out.println(sum);
//        System.out.println("2234567890223456789022345678902234567890.223456789022345678902234567890223456789");
    }

    private static String[] split(String str) {
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == '.') {
                return new String[]{str.substring(0, i), str.substring(i + 1)};
            }
        }
        return new String[]{str, ""};
    }

    private static String add(String num1, String num2) {
         // 坑1 :如何拿到正确的数
        String[] number1 = split(num1);
        String[] number2 = split(num2);
        String Integer1 = number1[0];
        String Integer2 = number2[0];
        String dot1 = number1[1];
        String dot2 = number2[1];
        int jw = 0;

        StringBuilder dotsb1 = new StringBuilder(dot1);
        StringBuilder dotsb2 = new StringBuilder(dot2);
        // 坑2:小数点尾数对不齐低的尾要补齐
        while (dotsb1.length() != dotsb2.length()) {
            if (dotsb1.length() < dotsb2.length()) {
                dotsb1.append('0');
            } else {
                dotsb2.append('0');
            }
        }
        dotsb1.reverse();
        dotsb2.reverse();

        StringBuilder integerRes = new StringBuilder();
        int len2 = dotsb1.length();
        boolean flag = true;
        for (int i = 0; i < len2; i++) {
            int tmp = jw;
            if (i < dotsb1.length()) {
                tmp = dotsb1.charAt(i) - '0' + tmp;
            }
            if (i < dotsb2.length()) {
                tmp = dotsb2.charAt(i) - '0' + tmp;
            }
            if (tmp >= 10) {
                jw = tmp / 10;
                tmp %= 10;
            } else {
                jw = 0;
            }
            char c = (char) (tmp + '0');
            // 坑3:刚开始加可能都是 0
            if (flag && c == '0') {
                continue;
            } else if (c != '0') {
                flag = false;
            }

            integerRes.append(c);
        }
        // 坑4:小数位可能全是 0
        if (!flag) {
            integerRes.append(".");
        }
        StringBuilder sb1 = new StringBuilder(Integer1);
        sb1.reverse();
        StringBuilder sb2 = new StringBuilder(Integer2);
        sb2.reverse();
        int len1 = sb1.length() > sb2.length() ? sb1.length() : sb2.length();
        for (int i = 0; i < len1; i++) {
            int tmp = jw;
            if (i < sb1.length()) {
                tmp = sb1.charAt(i) - '0' + tmp;
            }
            if (i < sb2.length()) {
                tmp = sb2.charAt(i) - '0' + tmp;
            }
            if (tmp >= 10) {
                jw = tmp / 10;
                tmp %= 10;
            } else {
                jw = 0;
            }
            integerRes.append((char) (tmp + '0'));
        }
        // 坑5:最后一个进位
        if (jw == 1) {
            integerRes.append('1');
        }
        // 最后倒回去
        return integerRes.reverse().toString();
    }
}
#趋势科技##笔试题目#
全部评论
我写了150行
点赞 回复 分享
发布于 2019-08-08 20:26
public static String add(String num1, String num2){         String result = null;         if (num1.contains(".")){             int des1 = getPoint(num1);             String subNum1 = num1.substring(0,des1);             String leftNum1 = num1.substring(des1+1);             if (num2.contains(".")){                 int des2  =getPoint(num2);                 String subNum2 = num2.substring(0,des2);                 String leftNum2 = num2.substring(des2+1);                 int max = leftNum1.length() > leftNum2.length()?leftNum1.length() : leftNum2.length();                 if (subNum1.length() > subNum2.length())                      subNum2 = addZeroAtLeft(subNum2,subNum1.length()-subNum2.length());                 else                     subNum1 = addZeroAtLeft(subNum1, subNum2.length()-subNum1.length());                 if (leftNum1.length() > leftNum2.length())                     leftNum2 = addZeroAtRight(leftNum2,leftNum1.length()-leftNum2.length());                 else                     leftNum1 = addZeroAtRight(leftNum1,leftNum2.length()-leftNum1.length());                 String newNum1 = subNum1+leftNum1;                 String newNum2 = subNum2+leftNum2;                  result = getAddResult(newNum1,newNum2,newNum1.length());                  StringBuffer sb = new StringBuffer(result);                  int pos = result.length();                  for (int i=0;i<max;i++){                      pos --;                  }                  sb.insert(pos,'.');                  result = new String(sb);             }             else {                 if (subNum1.length() > num2.length())                     num2 = addZeroAtLeft(num2,subNum1.length()-num2.length());                 else                     subNum1 = addZeroAtLeft(subNum1,num2.length()-subNum1.length());                 result = getAddResult(subNum1,num2,subNum1.length()) + "." + leftNum1;             }         }         else {             if (num2.contains(".")){                 int des2  =getPoint(num2);                 String subNum2 = num2.substring(0,des2);                 String leftNum2 = num2.substring(des2+1);                 if (num1.length() > subNum2.length())                     subNum2 = addZeroAtLeft(subNum2,num1.length()-subNum2.length());                 else                     num1 = addZeroAtLeft(num1,subNum2.length()-num1.length());                 result = getAddResult(num1,subNum2,num1.length()) + "." + leftNum2;             }             else{                 if (num1.length() > num2.length())                     num2 = addZeroAtLeft(num2,num1.length()-num2.length());                 else                     num1 = addZeroAtLeft(num1,num2.length()-num1.length());                 result = getAddResult(num1,num2,num1.length());             }         }         return result;     }     public static String addZeroAtLeft(String str, int len){         StringBuffer stringBuffer = new StringBuffer(str);         for (int i=0;i<len;i++)             stringBuffer.insert(0,'0');         return new String(stringBuffer);     }     public static String addZeroAtRight(String str, int len){         StringBuffer stringBuffer = new StringBuffer(str);         for (int i=0;i<len;i++)             stringBuffer.append('0');         return new String(stringBuffer);     }     public static String getAddResult(String num1, String num2, int len){         char[] result = new char[len+1];         for (int i=0;i<=len;i++)             result[i] = '0';         for (int i=len-1;i>=0;i--){             int a = Integer.parseInt(num1.charAt(i) + "");             int b = Integer.parseInt(num2.charAt(i) + "");             int c = Character.digit(result[i+1],10);             int sum = a + b + c;             result[i+1] = (char) ('0' + sum % 10);             result[i] = (char) ('0' + sum / 10);         }         StringBuffer sb = new StringBuffer();         for (int i = 0;i<=len;i++){             if (result[i]=='0'&&i==0)                 continue;             sb.append(result[i]);         }         return new String(sb);     }     public static int getPoint(String str){         int len = str.length();         int i;         for (i=len-1;i>0;i--){             if (str.charAt(i) == '.')                 break;         }         return i;     }
点赞 回复 分享
发布于 2019-08-09 10:39
有短且精辟的代码吗?
点赞 回复 分享
发布于 2019-08-09 10:08
60% 又臭又长。。
点赞 回复 分享
发布于 2019-08-09 07:31
import java.util.Scanner; public class Main {     public static void main(String[] args) {         Scanner input = new Scanner(System.in);         String num1 = input.nextLine();         String num2 = input.nextLine();         String sum = add(num1, num2);         System.out.println(sum);     }     /*      * 1234567890123456789012345678901234567890.      * 1234567890123456789012345678901234567890      * 1000000000100000000010000000001000000000.      * 1000000000100000000010000000001000000000      */     /*      * 2234567890223456789022345678902234567890.      * 223456789022345678902234567890223456789      */     private static String[] split(String str) {         for (int i = 0; i < str.length(); i++) {             if (str.charAt(i) == '.') {                 return new String[] { str.substring(0, i), str.substring(i + 1) };             }         }         return new String[] { str, "" };     }     private static String add(String num1, String num2) {         /*String[] number1 = num1.split("\\.");         String[] number2 = num2.split("\\.");*/         String[] number1 = split(num1);         String[] number2 = split(num2);         String nums1 = number1[0];         String nums2 = number2[0];         String dot1 = number1[1];         String dot2 = number2[1];         int dlength1 = dot1.length();         int dlength2 = dot2.length();         int min;         int[] dnums = new int[dlength1 > dlength2 ? dlength1 : dlength2];         if (dlength1 > dlength2) {             min = dlength2;             for (int i = min; i < dlength1; i++) {                 dnums[i] = dot1.charAt(i) - '0';             }         } else {             min = dlength1;             for (int i = min; i < dlength2; i++) {                 dnums[i] = dot2.charAt(i) - '0';             }         }         min--;         int top = 0;         while (min >= 0) {             int sum = (dot1.charAt(min) + dot2.charAt(min) + dnums[min] - 2 * '0');             if (sum >= 10) {                 dnums[min] = sum % 10;                 if (min != 0) {                     dnums[--min] = sum / 10;                 } else {                     top = sum / 10;                 }             } else {                 dnums[min--] = sum;             }         }         int[] num = new int[(nums1.length() > nums2.length() ? nums1.length() : nums2.length()) + 1];         int i = nums1.length() - 1;         int j = nums2.length() - 1;         int k = num.length - 1;         num[k] = top;         while (i >= 0 && j >= 0) {             int sum = (nums1.charAt(i) + nums2.charAt(j) + num[k] - 2 * '0');             if (sum >= 10) {                 num[k] = sum % 10;                 num[--k] = sum / 10;             } else {                 num[k--] = sum;             }             i--;             j--;         }         if (i < 0 || j >= 0) {             while (j >= 0) {                 int sum = (nums2.charAt(j) + num[k]) - '0';                 if (sum >= 10) {                     num[k] = sum % 10;                     num[--k] = sum / 10;                 } else {                     num[k--] = sum;                 }                 j--;             }         } else if (i >= 0 || j < 0) {             while (i >= 0) {                 int sum = (nums1.charAt(i) + num[k]) - '0';                 if (sum >= 10) {                     num[k] = sum % 10;                     num[--k] = sum / 10;                 } else {                     num[k--] = sum;                 }                 i--;             }         }         StringBuilder sb = new StringBuilder();         StringBuilder sb1 = new StringBuilder();         boolean sign = false, sign1 = false;         for (int s : num) {             if (s != 0)                 sign = true;             if (sign) {                 sb.append(s);             }         }         for (int h = dnums.length - 1; h >= 0; h--) {             if (dnums[h] != 0)                 sign1 = true;             if (sign1) {                 sb1.append(dnums[h]);                 if (h == 0)                     sb1.append(".");             }         }         sb.append(sb1.reverse());         return sb.toString();     } } 思路是不难,代码量太大了吧!!!
点赞 回复 分享
发布于 2019-08-08 22:18
为啥我提交说我编译不过 改类名变成Main就变成百分之0  我自测用例也没问题啊……
点赞 回复 分享
发布于 2019-08-08 21:18
这tm是给人做的题吗?
点赞 回复 分享
发布于 2019-08-08 20:29
。。我也是又臭又长,还特么40%就没心情改了
点赞 回复 分享
发布于 2019-08-08 20:28
这类名错了跑出来了吗😂
点赞 回复 分享
发布于 2019-08-08 20:26

相关推荐

2025-12-15 12:50
河北工程大学
sta666:我也是这个国际商业化的,三天,一天一面,就通过了,不过我是后端实习生,好好面感觉能过。
点赞 评论 收藏
分享
头像
01-12 14:44
已编辑
百度_高级研发工程师
今天看到了某平台攻击牛友的帖子,段段今天打算为牛友们说句话,我们的努力到底有没有意义。&nbsp;(原文复述:感觉牛客就是当年那群做题区毕业了开始找工作还收不住那股味,颇有一种从年级第一掉到年纪第二后抱怨考不上大学的区味)&nbsp;&nbsp;粗鄙,无礼,傲慢,攻击,在这里我没有看到任何有用的分析,我只看到了屁股决定脑袋的攻击,我只看到了嫉妒和眼红。一、去医院不看病你去逛街吗&nbsp;去医院你不去看病你去逛街吗?去加油站不加油你去抽烟吗?去部队你不训练战斗技能你去养老吗?来牛客你不努力求职你来干什么来了。&nbsp;牛客本身就是个求职平台,大家分享有用的知识,分享面经,分享offer,分享求职经验的,来牛客不就干这个来了吗?有什么问题吗?...
给个好点的工作吧啊啊...:不知道我看的是不是和博主同样的帖子,我记得原帖是表达的是有些匿名老是发几十万的offer侮辱价,然后就有牛友觉得凡尔赛了导致后面的评论有些偏激。我觉得这个最近闫学晶那个事情有点类似了,她说他儿子一年只能赚七八十万家庭生活都难以为继,不说普通家庭,多少大厂的程序员都赚不到这个数字,大部分家庭看到这种发言肯定会难受的一p,生活的担子又这么重,人都是需要发泄情绪的,互联网就是个极佳的载体,所以很多人直接就喷她了,人在情绪发泄的时候是不思考的,否则就不叫发泄了。然后还有一个点,段哥假定了这些喷的人全都是“躺平的”,这点可能有失偏颇,很多人一直在努力,但是始终缺乏天时地利人和的某一个条件,这点相信段哥找工作的过程中深有体会。绝大部分人都以结果的失败去否认了努力的全过程,可能只是别人努力的方向错了。就像一次面试,可能你准备了很久,结果面试官就是比较奇葩,一直问没有学习到的领域或知识点,然后有人凭一个挂掉的结果就直接给你扣了一个“躺平”的帽子,觉得挂掉是你不够努力,您心里滋味如何?再说点近点的,我也是od,多少同事深夜无偿加班,涨过一分工资吗?多少外包的技术大牛因为学历被困在外包,连od都进不去,这些人难道不努力吗?只是限制与生活、公司制度等等之类的无奈罢了。说到努力,又想到李家琦79元眉笔事件,这么多年有没有认真工作?有没有涨工资?他嘴里说出来是那么的理所当然,打工牛马都知道“任劳任怨”,“认真工作”真能涨工资?只干活不发声就等着被摘果子吧,企业里永远都是“汇报杰出者”升的最快(当然不是所有企业),这种事情相信段哥包括我甚至大部分od都经历过。最近辞职回老家,和老爸散步每次他都会感慨街上的蔬菜小贩多不容易,他们晚上就窝在那种三轮小货车的驾驶室里,腿都伸不直,我们这里晚上零下了,只盖一条薄毛毯,始终舍不得住我们镇上几十块的酒店,因为一车蔬菜就赚几百块顶多一千而且要卖好久,这样的例子还有太多了。这种芸芸众生可能辛苦了一天之后,打开手机看到网上的凡尔赛发言,跟风喷了几句发泄情绪,我觉得这种人不应该扣上“躺平”的帽子。我觉得大部分正常人都是努力的,或者曾经努力过,但世界上有太多努力解决不了的无奈了,甚至说你都没有那个努力的机会,不过正因如此,才显得坚持不懈的努力奋斗之人的难得可贵,认清生活的真相后仍然热爱生活,敢于直面现实的淋漓。
段段STEADY觉醒与突...
点赞 评论 收藏
分享
评论
3
10
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务