这些大厂笔试题 你都见识(被无情鞭挞)过了吗?—— 哔哩哔哩篇

题目链接:

哔哩哔哩2020校招


一.复数乘法

题目描述:

输入两个表示复数的字符串,输出它们相乘的结果的字符串
复数字符串用a+bi表示(a, b 为整数, i为虚数单位,i2=-1)

输入描述:

两个表示复数的字符串

输出描述:

输出a + bi形式的正确结果

示例1:

输入:
1+2i
2+1
输出:
0+5i

例子说明:

(1+2i)(2+i) = (2 + i + 4i + 2i * i) = 0 + 5i

示例2:

输入:
1+ -2i
3+4i
输出:
11+ -2i

例子说明:

(1+ -2i)(3+4i) = (3 + 4i - 6i - 8i * i) = 11+ -2i

个人总结:

写两个函数分别获取字符串的实部和虚部,然后根据计算规则计算出答案的实部和虚部,最后拼接字符串即可。

代码实现:

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s1 = sc.nextLine();
        String s2 = sc.nextLine();
        int real1 = getReal(s1);
        int image1 = getImage(s1);
        int real2 = getReal(s2);
        int image2 = getImage(s2);
        int real = real1 * real2 - image1 * image2;
        int image = real1 * image2 + real2 * image1;
        System.out.println(real + "+" + image + "i");
    }

    //实部也可能有负数 但是不写也过了 所以我就没改了 测试用例好像没这个
    public static int getReal(String s) {
        int res = 0;
        int idx = 0;
        while (s.charAt(idx) != '+') {
            res = res * 10 + s.charAt(idx++) - '0';
        }
        return res;
    }

    public static int getImage(String s) {
        int res = 0;
        int i = 0;
        while (s.charAt(i) != '+') {
            i++;
        }
        // i 下标对应 +
        i++;
        int flag = 1;
        for (; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c == 'i') {
                break;
            } else if (c == '-') {
                flag = -1;
            } else {
                res = res * 10 + c - '0';
            }
        }
        return flag * res;
    }
}

二.一年中的第几天

题目描述:

输入一个"YYYY-MM-dd"格式的日期字符串,输出该天是当年的第几天(1 月 1 日是每年的第 1 天)

输入描述:

一个"YYYY-MM-dd"格式的表示日期的字符串

输出描述:

该天是当年的第几天

示例1:

输入:
2019-01-09
输出:
9

示例2:

输入:
2004-03-01
输出:
61

个人总结:

个人没想到的地方,在判断是闰年的语句里面,需要加一个判断月份是否大于二,如果不大于,则不进入if语句内部。

代码实现:

import java.util.*;

public class Main {
    static int[] count = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        int yy = Integer.parseInt(s.substring(0, 4));
        int mm = Integer.parseInt(s.substring(5, 7));
        int dd = Integer.parseInt(s.substring(8));
        int ans = count[mm - 1] + dd;
        if (isLeapYear(yy) && mm >= 2) {
            ans += 1;
        }
        System.out.println(ans);
    }

    public static boolean isLeapYear(int year) {
        if (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0)) {
            return true;
        }
        return false;
    }
}

三.k个一组翻转链表

题目描述:

给你一个链表,每 k 个节点一组进行翻转,请返回翻转后的链表。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例 :
给定这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5

输入描述:

第一行:依次输入链表中的各个元素,以"#"结束
第二行:每组数量k

输出描述:

处理后的链表中的各个元素,以"->"连接

示例1:

输入:
1 2 3 4 5 #
2
输出:
2->1->4->3->5

示例2:

输入:
1 2 3 4 5 #
3
输出:
3->2->1->4->5

个人思路:

个人没想到的地方是我直接将字符串转换成字符数组了,然后没注意到每个数字字符之间的空格,等于空格字符直接被我无视了,然后写着出了点问题。

代码实现:

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        int k = sc.nextInt();
        String[] ss = s.split(" ");
        int len = 1;
        int end = 0;
        for (int i = 0; i < ss.length - 1; i++) {
            //len != k
            if (len != k) {
                len++;
            } else {
                //len == k
                reverse(ss, end, i);
                end = i + 1;
                len = 1;
            }
        }
        //输出
        for (int i = 0; i < ss.length - 1; i++) {
            if (i != ss.length - 2) {
                System.out.print(ss[i] + "->");
            } else {
                System.out.print(ss[i]);
            }
        }
    }

    public static void reverse(String[] ss, int left, int right) {
        while (left < right) {
            String s = ss[left];
            ss[left] = ss[right];
            ss[right] = s;
            left++;
            right--;
        }
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木木是木木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值