腾讯暑假实习在线笔编程试模拟试题-正方形判断

31人阅读 评论(0) 收藏 举报
分类:

2018年3月23日牛客网举行了腾讯实习在线模拟笔试

先看题目:正方形判断

这里写图片描述
这里写图片描述

  • 思路1:
    用4个点,任意三点组成一个等边直角三角形,并且斜边是直角边的根号2倍(设斜边为y,那么和直角边为x 那么可以推出 y=(√2)*x ).
    这里写图片描述

原理:正方形你可以看着是由两个三角形拼接而成.正方形任意三点组合成等边直接三角形.

这个比较简单我就不列出代码了.可以利用数学向量的思想


  • 思路2:
    四个点组成6个线段,四个线段长度相等(正方形边长相等),另外两个线段相同(正方形对角线垂直平分且长度相等),并且你还需要证明 两个的线段长度 是四个线段的长度 根号2倍.
    为什么还需要证明长度有根号2倍?.因为有可能是如下情况
    这里写图片描述
    这里写图片描述

图片来自我的金同学

import java.awt.Point;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Scanner;



public class Main {

    //向量类 有些方法并没有用到
    static  class MVector{

        Point startPoint;

        Point endPoint;

        Point vector;

        int unSqrtDistance;
        int x;
        int y;

        public MVector() {

        }

        public int getY() {
            return y;
        }

        public void setY(int y) {
            this.y = y;
            vector=new Point(x, y);
            unSqrtDistance=x*x+y*y;
        }

        public MVector(Point startPoint, Point endPoint) {
            super();

            this.startPoint = startPoint;

            this.endPoint = endPoint;

            vector=new Point(endPoint.x-startPoint.x, endPoint.y-startPoint.y);

            x=vector.x;
            y=vector.y;

            unSqrtDistance=(int) ( Math.pow(endPoint.x-startPoint.x, 2)+Math.pow(endPoint.y-startPoint.y, 2)) ;
        }

        public static int mutiply(MVector p1,MVector p2){

            int result=p1.x*p2.x+p1.y*p2.y;

            return result;
        }

        //向量乘法
        public int mutiply(MVector p1){

            return mutiply(p1,this);
        }

        //两个向量角度
        public static double getAngle(MVector p1,MVector p2){

            double resultCos=p1.mutiply(p2)/Math.sqrt((p1.unSqrtDistance*p2.unSqrtDistance));

            return Math.acos(resultCos);

        }
        public  double getAngle(MVector p2){


            return getAngle(this,p2);
        }
        public MVector(int x, int y) {
            super();
            this.x = x;
            setY(y);

        }


    }

    public static void main(String[] args) {


        Scanner scanner = new Scanner(System.in);

        int n = scanner.nextInt();
        boolean reulst[]= new boolean[n];

        int[]points=new int[4];
        MVector[] mVectors= new MVector[6];
        Point point[] = new Point[4];

        int flagDistance= Integer.MIN_VALUE;

        boolean[]  result=new boolean[n];


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

            for (int j = 0; j < 4; j++) {

                if((i&1)!=0){
                    point[j]=new Point(points[j], scanner.nextInt());
                }else{
                    points[j]=scanner.nextInt();
                }
            }

            //如果是输入y
            if((i&1)!=0){

                //1-2   第一个点和第二个点组成向量
                mVectors[0] =new MVector(point[0],point[1]);

                //1-3
                mVectors[1] =new MVector(point[0],point[2]);

                //1-4
                mVectors[2] =new MVector(point[0],point[3]);

                //2-3
                mVectors[3] =new MVector(point[1],point[2]);

                //2-4
                mVectors[4] =new MVector(point[1],point[3]);

                //3-4
                mVectors[5] =new MVector(point[2],point[3]);

                //第一个长度
                int distance1=-1;
                //长度出现的次数
                int flag1=0;
                //同上
                int distance2=-1;
                int flag2=0;
                //注意向量长度为0的问题,如果两个点相同.
                if (mVectors[0].unSqrtDistance>0) {
                    distance1=mVectors[0].unSqrtDistance;
                    flag1++;
                }



                //判断6个边 是否只有两种长度 并且数量是4,另一个是2
                for (int j = 1; j < mVectors.length&&distance1!=-1; j++) {
                    if(mVectors[j].unSqrtDistance<=0){
                        break;  
                    }
                    else if(distance2==-1&&mVectors[j].unSqrtDistance!=distance1){
                        distance2=mVectors[j].unSqrtDistance;
                        flag2++;
                    }else if(mVectors[j].unSqrtDistance==distance1){
                        flag1++;
                    }else if (mVectors[j].unSqrtDistance==distance2) {
                        flag2++;
                    }else{
                        //出现第三个长度
                        break;
                    }
                }


                if ((flag1==4&&flag2==2)||(flag2==4&&flag1==2)) {
                    //长度根号倍 判断.正方形的边和对角线的平分 差两倍,不要轻易算根号 不然丢精度 如根号5
                    if (distance1<<1==distance2||distance2<<1==distance1) {
                        result[(i-1)/2]=true;
                    }

                }
            }


        }

        System.out.println(Arrays.toString(result));

    }
}
查看评论

2016腾讯实习生在线笔试

第二道是给一个非负整数,输出n为边长的蛇形矩阵。按照先行后列的顺序输出即可。 比如: 给一个3,3的蛇形矩阵是 [ [1,2,3], [8,9,4], ...
  • u011327334
  • u011327334
  • 2016-04-03 21:30:59
  • 2076

腾讯面试题(附答案)

这里的答案都是本人做的,非标准答案。如果错误,请在评论里指正,一起讨论共同进步!谢谢!腾讯面试题1、大端与小端的概念?各自的优势是什么?【答】大端与小端是用来描述多字节数据在内存中的存放顺序,即字节序...
  • lisong694767315
  • lisong694767315
  • 2016-05-06 02:41:31
  • 17167

腾讯模拟笔试——判断正方形

2018腾讯春招web前端模拟笔试——判断正方形 这几天投了腾讯的web前端岗位,昨晚做了腾讯模拟笔试,前端相关内容考的挺少的,然后有两道编程题,做了第一道。 第一道编程题是给定四个点,判断是否是...
  • chenh297
  • chenh297
  • 2018-03-24 11:14:34
  • 95

腾讯2018笔试模拟题之判断正方形

第一行输入n;随后输入n组数据,每组数据的第一行先输入横坐标,第二行输入纵坐标;判断四个点能否组成正方形,若是输出Yes,否则输出No.#include&amp;lt;iostream&amp;gt;...
  • qinxinli
  • qinxinli
  • 2018-03-26 22:54:56
  • 45

腾讯笔试题

        我没有参加过腾讯的笔试题,以下笔试题都是从网上找来,但都加上了我个人的解法与心得。001.写出判断ABCD四个表达式的是否正确, 若正确, 写出经过表达式中 a的值(3分)int a ...
  • OpenMySelf
  • OpenMySelf
  • 2008-05-22 11:14:00
  • 2146

2016腾讯实习生在线笔试题

1.阐述一下stack与heap区别? 2.第二道是给一个非负整数,输出n为边长的蛇形矩阵。按照先行后列的顺序输出即可。  比如:  输入:3 输出:1 2 3 8 9 4 7 6 5 给一...
  • hsd2012
  • hsd2012
  • 2016-04-05 18:58:33
  • 496

腾讯2017年实习招聘在线笔试题(求逆序对)

题目:在一个排序中,如果任意一对元素前面的值比后面的值大,我们就说这个排序有一个逆序,一个排序中逆序的总数为逆序数。例:DBBAC的逆序数为6(DB、DB、DA、DC、BA、BA)。实现一个函数,计算...
  • wocbw123
  • wocbw123
  • 2017-04-04 21:45:39
  • 620

2016腾讯模拟笔试题

题目: 根据N输出蛇字形矩阵 矩阵按行输出例如: N=3 1 2 3 8 9 4 7 6 5#include #include using namespace std; //将整个图形看成...
  • justdoithai
  • justdoithai
  • 2016-09-01 22:27:30
  • 223

腾讯2018安卓实习模拟笔试题——魔法阵

真的觉得自己数据结构与算法也太薄弱了,好多stl容器都不会用,真的是练太少了导致很不熟练!...
  • A657997301
  • A657997301
  • 2018-03-23 23:00:22
  • 147

腾讯模拟笔试编程题--根据输入的点坐标判断是够能构成一个正方形

可能我写的比较繁琐。。。。。。。。 package tencent.simulation; import java.util.Scanner; /** * 输入一个整数t,表示有几组数据 ...
  • flower_CSDN
  • flower_CSDN
  • 2018-03-26 18:32:01
  • 77
    个人资料
    等级:
    访问量: 50万+
    积分: 6944
    排名: 4165