ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

字节跳动 2022/3/20笔试

2022-03-20 21:02:59  阅读:139  来源: 互联网

标签:20 字节 int 节点 2022 sc new public String


题目1

 

 

import java.io.*;
import java.util.*;
class Test{
    
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        String[] str = s.split(" ");
        
        int n =Integer.parseInt(str[0]);//n天
        int m =Integer.parseInt(str[1]);//m个补给站

        int[] price = new int[m];
        for(int i=0;i<m;i++){
           
            String[] tmp =sc.nextLine().split(" ");
            price[i]=Integer.parseInt(tmp[1]);
            
        }
        
        int res=0;
        for(int i=0;i<m;i++){
            int j=i;
            //当前补给站 往后查询,若后面的连续几个站的价格都比当前高,那么在当前站买够
            //比当前站价格连续高的几个站需要的补给
            while((j+1)<=m-1 && price[j+1]>price[i]  ){
                j++;
            }
            if(j<m-1 || n<=m){
                res += price[i]*(j-i+1);
                i=j;
               
            }else{//注意边界条件,如果补给站m小于要徒步的天数n,我们需要买够n天的口粮

                res +=(price[i])*(n-i);
                i=j;
            }
   
        }

       System.out.println(res);
        
       
    }
    
    
}

题目2

并查集思想

1、判断图有没有环

2、一堆数据分组,有几个组

3、亲戚关系,给一堆关系,然后问某两个是否有关系

import java.util.*;
/**
 * 星球大战
 * 根据题意 我们需要完成的就是根据输入以及他们之间的师徒关系,
 * 划分出有几个集合,每个集合有多少个人,然后再根据每个集合的人头来划分土地面积
 */
public class hello {
    public static void main(String[] args){
        //1、输入
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();//魔法师总数
        int m =sc.nextInt();//师徒关系
        //存师徒关系
        int[][] relation = new int[m][2];//分别表示 徒弟-师傅
        for(int i=0;i<m;i++){
            relation[i][0]=sc.nextInt();//徒弟
            relation[i][1]=sc.nextInt();//师傅
        }

        // 2、根据师徒关系 看可以分为几个集合 每个集合多少人
        MyUnion myUnion= new MyUnion(n);//初始化 parent  sum
        for(int i=0;i<m;i++){
            int stu =relation[i][0];
            int tech = relation[i][1];
            myUnion.union_fun(stu-1,tech-1);//内部已封装,当两个节点的帮派老大不同,才合并这两个帮派
        }
        // 3、统计每个帮派人数
        Integer[] ans = new Integer[myUnion.size];
        int index=0;
        for(int i=0;i<n;i++){
            if(myUnion.parent[i]==-1){
                ans[index]=myUnion.sum[i]; //统计每个帮派的人头数
                index++;

            }
        }
        Arrays.sort(ans, new Comparator<Integer>(){
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });

        System.out.println(myUnion.size);//有多少个组
        for(Integer an :ans){//每个组划分得到的面积
            System.out.println(579*an/n + " ");
        }



    }


    public static class MyUnion {
        private int[] parent; //记录每一个节点的父节点
        private final int[] sum;//记录每一个集合(帮派)的成员数目,初始化的时候因为每个节点自成一派,所以初始每个帮派数目都是1
        public int size;//记录总的有多少个集合(帮派)



        //初始化
        //刚开始,假设每个数据是一个分组,然后根据遍历关系,不断修改不同数据之间的连接
        //parent[i]  表示元素i的根节点(父亲)为parent[i]
        //当遍历完所有的关系后,我们统计 parent数组中还有几个-1,那就说明这些关系有几个分组
        //假设当前关系约束的两个节点,我们要先找到两个节点的根节点,判断根节点是否相同
        //说明两个节点属于同一个集合 并且已经成环
        //若两个节点的根节点不同,然后把一个集合的帮派合并到另一个集合中
        // 1、初始化,每个节点各成一派,根节点否设置为-1
        public MyUnion(int length){
            this.parent = new int[length];
            this.size = length;
            this.sum = new int[length];
            for(int i=0;i<length;i++){
                parent[i]=-1;
                sum[i]=1;
            }
        }

        //2、 找某个节点的所属集合(帮派)的老大
        public int find_root(int i){
            if(parent[i]==-1){
                //说明自己根节点为-1,自己就是帮派老大
                return i;
            }else {
                return find_root(parent[i]);//递归调用,只有parent[i]==-1,此时的i才是某个集合帮派的老大
            }
        }

        //3、合并 两个帮派(集合)
        public void union_fun(int i,int j){
            //先找到各自节点的帮派老大
            int root_i = find_root(i);
            int root_j =find_root(j);
            if(root_i !=root_j){
                //两个帮派老大不一样的时候才需要合并
                parent[root_i]=root_j; //这里相当于i所在的帮派合并到j的帮派
                sum[root_j] +=sum[root_i];//那么 i帮派人数都要算到j的帮派中去
                size--;//每合并了两个帮派,总的帮派数目减少1
            }



        }
        // 4、查询某两个节点 是否属于同一个集合(帮派)
        //即验证这两个节点的 老大(根)是否相同,相同就说明是一个帮派
        public boolean isconnected(int i,int j){
            int root_i = find_root(i);
            int root_j =find_root(j);
            return root_i == root_j;  //true  or false
        }
    }

}

 题目3

 

import java.util.*;

public class hello {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        String[] s1 = s.split(" ");

        int n =Integer.parseInt(s1[0]);
        int q =Integer.parseInt(s1[1]);
        String s2 = sc.nextLine();//操作的字符串
        char[]  str = s2.toCharArray();
        int[][] ac = new int[q][2];
        for(int i=0;i<q;i++){
            ac[i][0]=sc.nextInt();
            ac[i][1]=sc.nextInt();
        }

        for(int i=0;i<q;i++){
            int start =ac[i][0];
            int end =ac[i][1];

            //两端点相等
            if(start==end){
                if(Character.isUpperCase(str[end-1])){
                    str[end-1]+= 32;
                }else{
                    str[end-1]-= 32;
                }
            }else{

                //两端点不等
                //在这个区间的 大变小 小变大
                for(int j=start-1;j<=end-1;j++){
                    System.out.println(j);
                    if(Character.isLowerCase(str[j])){
                        str[j]-= 32;
                    }else{
                        str[j]+= 32;
                    }
                    
                }

            }
        }

        String res=String.valueOf(str);

        System.out.println(res);

    }
}

====================================================================》

 题目4

 没做!!!!!!!!!!!!

 

 

 

标签:20,字节,int,节点,2022,sc,new,public,String
来源: https://blog.csdn.net/weixin_50666824/article/details/123621022

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有