网易笔试题两道

赶去公司

终于到周末啦!小易走在市区的街道上准备找朋友聚会,突然服务器发来警报,小易需要立即回公司修复这个紧急bug。假设市区是一个无限大的区域,每条街道假设坐标是(X,Y),小易当前在(0,0)街道,办公室在(gx,gy)街道上。小易周围有多个出租车打车点,小易赶去办公室有两种选择,一种就是走路去公司,另外一种就是走到一个出租车打车点,然后从打车点的位置坐出租车去公司。每次移动到相邻的街道(横向或者纵向)走路将会花费walkTime时间,打车将花费taxiTime时间。小易需要尽快赶到公司去,现在小易想知道他最快需要花费多少时间去公司。

思路

各算各的即可求解

代码

public class First {
    public  static  void  main(String [] arg)
    {
        Scanner scanner = new Scanner( System.in);
        int a = scanner.nextInt();
        int x[] = new int[a];
        int y[] = new int[a];
        int i=0,j=0;
        while (i<a)
        {
            x[i++]=scanner.nextInt();
        }

        while (j<a)
        {
            y[j++]=scanner.nextInt();
        }


        int gx = scanner.nextInt();
        int gy = scanner.nextInt();
        int wt = scanner.nextInt();
        int tt = scanner.nextInt();
        System.out.println(solution(x, y, gx, gy, wt, tt));
    }

   static public  int solution(int x[] ,int y [] , int gx,int gy,int walktime,int taxitime)
    {

        int all = Math.abs(gx*walktime)+Math.abs(gy*walktime);
        int  []time = new int[x.length];
        for ( int i = 0 ; i <x.length;i++)
        {
            int wt= Math.abs(x[i]*walktime) +Math.abs(y[i]*walktime);
            int tt = Math.abs(gx-x[i])*taxitime+Math.abs(gy-y[i])*taxitime;
            time[i]=wt+tt;
        }
        Arrays.sort(time);
        if (time[0]<all)
        return  time[0];
        return all;
    }
}

调整队形

在幼儿园有n个小朋友排列为一个队伍,从左到右一个挨着一个编号为(0~n-1)。其中有一些是男生,有一些是女生,男生用’B’表示,女生用’G’表示。小朋友们都很顽皮,当一个男生挨着的是女生的时候就会发生矛盾。作为幼儿园的老师,你需要让男生挨着女生或者女生挨着男生的情况最少。你只能在原队形上进行调整,每次调整只能让相邻的两个小朋友交换位置,现在需要尽快完成队伍调整,你需要计算出最少需要调整多少次可以让上述情况最少。例如:
GGBBG -> GGBGB -> GGGBB
这样就使之前的两处男女相邻变为一处相邻,需要调整队形2次

思路

有两种排序方式男孩在前,或者女孩在前,我们可以计算一下,他们的移动次数

代码

public class Two {
    public  static  void  main(String [] arg)
    {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String a = scanner.next();
            System.out.println(solution1(a));
        }
    }
    static  public  int solution(String a)
    {
        int test= 0 ,test1=0;
        char[] c=a.toCharArray();
        char[] c1 =a.toCharArray();
        for ( int i=0;i<c.length;i++)
            for (int j = 0 ;j<c.length-1;j++)
            {
                if (c[j]=='B'&&c[j+1]=='G')
                {
                    char x= c[j];
                    c[j]=c[j+1];
                    c[j+1]=x;
                    test++;
                }
            }
        System.out.println(Arrays.toString(c));
        for ( int i=0;i<c1.length;i++)
            for (int j = 0 ;j<c1.length-1;j++)
            {
                if (c1[j]=='G'&&c1[j+1]=='B')
                {
                    char x= c1[j];
                    c1[j]=c1[j+1];
                    c1[j+1]=x;
                    test1++;
                }
            }
        System.out.println(Arrays.toString(c1));
        if (test<test1)
        return test;
        else
            return test1;
    }
    static  public  int solution1(String a)
    {
        char[] c =a.toCharArray();
        int left=0,left1=0;
        int right=0,right1=0;
        for (int i =0;i<c.length;i++)
        {
            if (c[i]=='G')
                left++;
            else
                left1+=left;
        }
        for (int i =0;i<c.length;i++)
        {
            if (c[i]=='B')
                right++;
            else
                right1+=right;
        }
        return left1>right1?right1:left1;

    }
    static  public  int solution1(String a)
    {
        char[] c =a.toCharArray();
        int left=0,left1=0;
        int right=0,right1=0;
        /*
        比如说GGGBG
        下面是将B放在前面,然后我们不用排序,因为B前面有3个G
        所以就需要向前三次
         */
        for (int i =0;i<c.length;i++)
        {
            if (c[i]=='G')
                left++;             //记录前面有多少个G
            else                    //出现了B,那么将这个B转移到前面就需要
                left1+=left;        //这么多次操作
        }

//        类似的;
//        比如说BGBGBG;
//        第一个G前面有一个B,移动一次
//        第二个G前面有两个B,就需要移动两次

        for (int i =0;i<c.length;i++)
        {
            if (c[i]=='B')
                right++;
            else
                right1+=right;
        }
        return left1>right1?right1:left1; //比较一下那种移动次数少,就返回喽

    }
}

收获

  1. 在第二题的时候,冒泡写错了;基础知识不扎实啊!
  2. 题还是挺简单的,认真做,想办法用简单的办法做出来;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值