微众java面试题_微众java岗笔试题解

三角形数字

直接找出公式,套就完事

package com.weizhong;

import java.io.*;

import java.util.*;

import java.text.*;

import java.math.*;

import java.util.regex.*;

public class Main1 {

/*请完成下面这个函数,实现题目要求的功能

当然,你也可以不按照下面这个模板来作答,完全按照自己的想法来 ^-^

******************************开始写代码******************************/

static String GetResult(int N) {

int s = 0;

for (int i = 1; i < 1000000; i++) {

s += i;

if (s >= N) {

int total = i + 1;

int sub = 0;

if ( i % 2 == 0) {

sub = i - (s-N);

} else {

sub = s - N + 1;

}

return String.valueOf(sub) + "/" + String.valueOf(total- sub);

}

}

return null;

}

/******************************结束写代码******************************/

public static void main(String[] args){

Scanner in = new Scanner(System.in);

String res;

int _N;

_N = Integer.parseInt(in.nextLine().trim());

res = GetResult(_N);

System.out.println(res);

}

}

正方形

笨法子,从6到1放

654都是1个正方形一部车,5塞满1,4先塞2,没满再塞1

3复杂些,用最后一部车的剩余空间来塞2跟1,也是先塞2再塞1

2的最后一部车空位塞1

1直接塞

package com.weizhong;

import java.util.Scanner;

public class Main2 {

public static void main(String[] args) {

Scanner in = new Scanner(System.in);

int[] arr = new int[6];

for (int i = 0; i < 6; i++) {

arr[i] = in.nextInt();

}

int ret = 0;

if (arr[5] > 0) {

ret += arr[5];

}

if (arr[4] > 0) {

ret += arr[4];

arr[0] -= 11*arr[4];

}

if (arr[3] > 0) {

ret += arr[3];

if (arr[1] >= 5* arr[3]) {

arr[1] -= 5* arr[3];

} else {

arr[0] -= 4*(5*arr[3] - arr[1]);

arr[1] = 0;

}

}

if (arr[2] > 0) {

if (arr[2] % 4 == 0) {

ret += arr[2] / 4;

}

else {

ret += arr[2] / 4 + 1;

int s = arr[2] % 4;

if (s == 1) {

if (arr[1] >= 5) {

arr[1] -= 5;

arr[0] -= 7;

} else {

arr[0] -= 27-4*arr[1];

arr[1] = 0;

}

} else if (s == 2) {

if (arr[1] >= 3) {

arr[1] -= 3;

arr[0] -= 6;

} else {

arr[0] -= 18 - 4*arr[1];

arr[1] = 0;

}

} else {

if (arr[1] >= 1) {

arr[1] -= 1;

arr[0] -= 5;

} else {

arr[0] -= 9;

}

}

}

}

if (arr[1] > 0) {

if (arr[1] % 9 == 0) {

ret += arr[1] / 9;

}

else {

ret += arr[1] / 9 + 1;

arr[0] -= (arr[1] % 9) * 4;

}

}

if (arr[0] > 0) {

if (arr[0] % 36 == 0) ret += arr[0] / 36;

else ret += arr[0] / 36 + 1;

}

System.out.println(ret);

}

}

膨胀圆

这题复杂一点,重点是把圆抽象出一个类,然后再计算,思路会清晰些

过程:

初始每个圆的半径都为0

对所有圆两两求相遇时间(这里注意如果有一个是停止膨胀的圆,时间要x2)

找到最早相遇的两个圆,以及相遇时间,将这两个圆停止膨胀

更新所有圆的半径

重复上述过程,直到所有圆都停止膨胀

复杂度O(n^3),不知道有没有更好的算法

也许可以往图的方向去想

package com.weizhong;

import java.util.ArrayList;

import java.util.List;

import java.util.Scanner;

public class Main3 {

public static void main(String[] args) {

Scanner in = new Scanner(System.in);

int n = in.nextInt();

List list = new ArrayList<>();

for (int i = 0; i < n; i++) {

float x = in.nextFloat();

float y = in.nextFloat();

list.add(new Node(x, y));

}

int running = list.size();

while (running > 0) {

float minDis = Float.MAX_VALUE;

int a = -1;

int b = -1;

for (int i = 0; i < list.size() - 1; i++) {

for (int j = i + 1; j < list.size(); j++) {

float dis = Node.timeToMeet(list.get(i), list.get(j));

if (dis < minDis) {

minDis = dis;

a = i;

b = j;

}

}

}

for (int i = 0; i < list.size(); i++) {

Node node = list.get(i);

if (!node.isStop) node.setR(node.getR() + minDis);

}

Node n1 = list.get(a);

Node n2 = list.get(b);

if (!n1.isStop) {

n1.setStop(true);

running--;

}

if (!n2.isStop) {

n2.setStop(true);

running--;

}

}

for (int i = 0; i < list.size() -1; i++) {

System.out.printf("%.3f ", list.get(i).getR());

}

System.out.printf("%.3f", list.get(list.size()-1).getR());

}

}

class Node {

float x;

float y;

float r;

boolean isStop;

public Node(float x, float y) {

this.x = x;

this.y = y;

r = 0;

isStop = false;

}

public static float distance(Node n1, Node n2) {

return (float)Math.sqrt((n1.x - n2.x)* (n1.x - n2.x) + (n1.y -n2.y) * (n1.y - n2.y));

}

public static float timeToMeet(Node n1, Node n2) {

if (n1.isStop() && n2.isStop()) {

return Float.MAX_VALUE;

} else if (n1.isStop() || n2.isStop) {

return (distance(n1, n2) - n1.r - n2.r);

} else {

return (distance(n1, n2) - n1.r - n2.r) / 2;

}

}

public float getX() {

return x;

}

public void setX(float x) {

this.x = x;

}

public float getY() {

return y;

}

public void setY(float y) {

this.y = y;

}

public float getR() {

return r;

}

public void setR(float r) {

this.r = r;

}

public boolean isStop() {

return isStop;

}

public void setStop(boolean stop) {

isStop = stop;

}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值