09-08字节跳动2,3题其中2题没有跑,3题应该没问题

都是自己理解的不对勿喷

//这个题主要还是理解题意,一排方块,里面有自然数,<,>三种情况。走到数字后数字减一,走到0时摧毁这个方块然后继续走,走到<>时改变方向,若下一个也为<>摧毁当前方块
package AMain;
import java.util.Arrays;
import java.util.LinkedList;
public class MainB {
    static LinkedList list = new LinkedList();
    public static void main(String[] args) {
        while (true) {
            String[] temp = new String[]{"", "4", "7", ">", "9", "8", "3", "", "9", "4", "1"};
            int nn = (int) (Math.random() * 10);
            int mm = 10;
            int l = (int) (Math.random() * nn);
            int r = (int) (Math.random() * nn);
            if (l > r) {
                l = 0;
            }
            String[] arr = new String[nn];
            for (int i = 0; i < arr.length; i++) {
                arr[i] = temp[(int) (Math.random() * temp.length)];
            }
            if (arr.length == 0) {
                continue;
            }
            arr = new String[]{">", "2", "2", "<"};
            System.out.println( "数组:" + Arrays.toString( arr ) + "--left:" + l + "--right:" + r );
            process( 0, 3, arr );
            System.out.println( list.get( 0 ) );
            list.clear();
        }
    }
    //核心方法
    private static void process(int l, int r, String[] arr) {
        int count = 0;
        int i = l;
        //思路:我用-1代表这个方块已经被摧毁
        boolean flag = true;//走向:true往右走,false往左走
        while (true) {
            if (i > r || i < l) {//越界
                list.add( count );
                return;
            } else {
                if (arr[i].equals( ">" )) {
                    int temp = i;//临时变量,当下一步为时需要将当前摧毁
                    i++;
                    while (i <= r && arr[i].equals( "-1" )) {//一直找直到不是摧毁方块
                        i++;
                    }
                    if (i > r) {//先判断是否越界
                        list.add( count );
                        return;
                    } else if (arr[i].equals( ">" )) {
                        flag = true;//更改走向
                        arr[temp] = "-1";//上一个方块摧毁
                    } else if (arr[i].equals( "<" )) {//同上
                        flag = false;
                        arr[temp] = "-1";
                    }
                } else if (arr[i].equals( "<" )) {//同上
                    int temp = i;
                    i--;
                    while (i >= l && arr[i].equals( "-1" )) {
                        i--;
                    }
                    if (i < l) {
                        list.add( count );
                        return;
                    } else if (arr[i].equals( ">" )) {
                        flag = true;
                        arr[temp] = "-1";
                    } else if (arr[i].equals( "<" )) {
                        flag = false;
                        arr[temp] = "-1";
                    }
                } else if (Integer.valueOf( arr[i] ) == -1) {//为摧毁方块,需要判断方向
                    if (flag) {
                        i++;
                    } else {
                        i--;
                    }
                } else {
                    int temp = Integer.valueOf( arr[i] );//为数字时,先加数字,在减一
                    count += temp;
                    arr[i] = String.valueOf( temp - 1 );
                    if (flag) {
                        i++;
                    } else {
                        i--;
                    }
                }
            }
        }
    }
}
给三个没有刻度只知道最大容量的桶,假设容量分别为xyz桶可以盛满水,可以倒掉,可以两桶之间倒水(直到一桶倒空或者倒满)请求出最快需要多少步能够量出k的容量
假设这三个桶的容量为3 5 8 要求量出4升最短为 0 0 0—0 5 0—3 2 0—0 2 0—2 0 0—2 5 0—3 4 0
DFS然后列出所有情况,放入队列中一个一个对比是否为结果
package AMain;
import java.util.LinkedList;
public class Main {
    public static void main(String[] args) {
        LinkedList<Node> list = new LinkedList<>(  );
        int x = 3,y=5,z=8,res = 4;
        Node node = new Node(0,0,0,0);
        list.add( node );
        while(!list.isEmpty()){
            Node n = list.pollFirst();
            if(n.x==res || n.y==res || n.z ==res){//结束
                System.out.println(n.index);
                return;
            }else{
                //以下为倒水的所有情况
                if(n.x == 0){//x空
                    Node n1 = new Node(x,n.y,n.z,n.index+1);
                    list.add( n1 );
                }
                if(n.y==0){//y空
                    Node n1 = new Node(n.x,y,n.z,n.index+1);
                    list.add( n1 );
                }
                if(n.z == 0){//z空
                    Node n1 = new Node(n.x,n.y,z,n.index+1);
                    list.add( n1 );
                }
                if(n.x!=0 && n.y<y){//x有水且可以往y中倒入
                    Node n1 = null;
                    if(y-n.y>=n.x){//倒入后x没有剩余
                        n1 = new Node(0,n.y+n.x,n.z,n.index+1);
                    }else{//有剩余
                        n1 = new Node(n.x-(y-n.y),y,n.z,n.index+1);
                    }
                    list.add( n1 );
                }
                if(n.x!=0 && n.z<z){//x有水且可以往z中倒入
                    Node n1 = null;
                    if(z-n.z>=n.x){//倒入后x没有剩余
                        n1 = new Node(0,n.y,n.z+n.x,n.index+1);
                    }else{//有剩余
                        n1 = new Node(n.x-(z-n.z),n.y,z,n.index+1);
                    }
                    list.add( n1 );
                }
                if(n.y!=0 && n.x<x){//y有水且可以往x中倒入
                    Node n1 = null;
                    if(x-n.x>=n.y){//倒入后y没有剩余
                        n1 = new Node(n.x+n.y,0,n.z,n.index+1);
                    }else{//有剩余
                        n1 = new Node(x,n.y-(x-n.x),n.z,n.index+1);
                    }
                    list.add( n1 );
                }
                if(n.y!=0 && n.z<z){//y有水且可以往z中倒入
                    Node n1 = null;
                    if(z-n.z>=n.y){//倒入后y没有剩余
                        n1 = new Node(n.x,0,n.z+n.y,n.index+1);
                    }else{//有剩余
                        n1 = new Node(n.x,n.y-(z-n.z),z,n.index+1);
                    }
                    list.add( n1 );
                }
                if(n.z!=0 && n.x<x){//z有水且可以往x中倒入
                    Node n1 = null;
                    if(x-n.x>=n.z){//倒入后z没有剩余
                        n1 = new Node(n.x+n.z,n.y,0,n.index+1);
                    }else{//有剩余
                        n1 = new Node(x,n.y,n.z-(x-n.x),n.index+1);
                    }
                    list.add( n1 );
                }
                if(n.z!=0 && n.y<y){//z有水且可以往y中倒入
                    Node n1 = null;
                    if(y-n.y>=n.z){//倒入后z没有剩余
                        n1 = new Node(n.x,n.y+n.z,0,n.index+1);
                    }else{//有剩余
                        n1 = new Node(n.x,y,n.z-(y-n.y),n.index+1);
                    }
                    list.add( n1 );
                }
            }

        }
        System.out.println(-1);
    }
}
class Node {
    int x;
    int y;
    int z;
    int index ;
    public Node(int x,int y,int z,int index){
        this.x = x;
        this.y = y;
        this.z = z;
        this.index = index;
    }
}
#笔试题目##笔经##秋招##Java##校招##字节跳动#
全部评论
同学你投的是啥岗位呀
点赞 回复
分享
发布于 2019-09-09 16:20

相关推荐

3 4 评论
分享
牛客网
牛客企业服务