校招全国统一模拟笔试(七月场)技术类编程题

程序可以运行,只是复杂度方面可能有的问题还没解决= =

一、给出一个含有n个数字的序列a1,a2,a3,…an,可以进行以下操作:
一次操作定义为对这个序列的每个数字进行以下两种改变之一:
1.ai ÷ 2
2.ai × 3
每一次的操作中,必须保证至少有一个数字是第1种改变;并且经过每次操作后,每一个数字都必须是整数。
牛牛得知,每进行一次操作,他就可以得到一颗西瓜糖,但是由于孱弱的数学功底,他不知道何时该对某一个数字进行第一种还是第二种改变,这使得他十分纠结,于是他找来了睿智的你,希望你帮他计算出,他最多可以得到多少颗西瓜糖。

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {

        int[] a = new int[100000];//一开始写的1000提示内存问题,改为100000
        int result = 0;       
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();//有n个数

        for(int i = 0; i int c = sc.nextInt();//读取每个整数
            a[i] = c;
        }
        //这个当时看懂题目花了一些时间,一次操作是对所有整数做改变,所以这里就看2的倍数能被除几遍
        for(int i = 0; i while(a[i]%2==0){
                a[i] = a[i]/2;
                result++;               
            }
        }
        //没有2的倍数,就直接输出0
        if(result==0){
            System.out.println(0);
        }
        else{
            System.out.println(result);
        }
    }           
}

二、牛牛很喜欢对数字进行比较,但是对于3 > 2这种非常睿智的比较不感兴趣。上了高中之后,学习了数字的幂,他十分喜欢这种数字表示方法,比如xy。
由此,他想出了一种十分奇妙的数字比较方法,给出两个数字x和y,请你比较xy和yx的大小,如果前者大于后者,输出”>”,小于则输出”<”,等于则输出”=”。

import java.util.Scanner;

public class Main { 
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        double a = sc.nextDouble();
        double b = sc.nextDouble();                 
        if(a==b){
            System.out.println('=');
        }       
        else{ 
            //这里直接算次方数值太大了,在网上找到了公式,直接判断log(a)*b和log(b)*a的大小就OK了                    
            double result = (Math.log(a)*b)-(Math.log(b)*a);
            if(result==0){
                System.out.println('=');
            }
            else if(result<0){
                System.out.println('<');
            }
            else if(result>0){
                System.out.println('>');
            }
        }                  
    }
}

三、一般的括号匹配问题是这样的:
给出一个字符串,判断这个括号匹配是不是合法的括号匹配。
如”((” 和 “())”都不是合法的括号匹配,但是”()()()”,”(()())()”等就是合法的括号匹配。
这个问题解决起来非常简单,相信大家都知道怎么解决。
现在给出一个加强版的括号匹配问题: 给出n个由括号 ‘(’ 和 ‘)’ 组成的字符串,请计算出这些字符串中有多少对字符串满足si + sj是合法的括号匹配。如果si + sj和sj + si都是合法的括号匹配(i ≠ j),那么这两种搭配都需要计入答案;如果对于si,si + si是合法的括号匹配,那么也需要计入答案。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        String[] a = new String[100000];
        int result = 0;
        double n = sc.nextDouble();
        for(int i = 0; i <= n; i++){
            a[i] = sc.nextLine();
        }        
        for(int i = 1; i <= n; i++){
            //si + si是否合法
            if(right(a[i],a[i])!=0){
                result++;               
            }             
            for(int j = i+1; j <= n; j++){
                 //si + sj是否合法
                if(right(a[i],a[j])!=0){
                    result++;               
                }
                //sj + si是否合法
                if(right(a[j],a[i])!=0){
                    result++;               
                }                 
            }
        }
        System.out.println(result);
    }     
    //这道题的测试只通过了80%,后边的应该是复杂度太高,可以去网上找找更好的方法
    public static int right(String a,String b){
        String s = a+b;
        int left = 0;         
        for(int i = 0; i char ac = s.charAt(i);
            if(ac=='('){
                left++; 
            }
            else if(ac==')'){                 
                left--;
            }           
            if(left<0){                     
                return 0;
            }
        }
        if(left!=0){            
            return 0;
        }
            return 1;             
    }
}

四、有一个长度为N的序列。一开始,这个序列是1, 2, 3,… n - 1, n的一个排列。
对这个序列,可以进行如下的操作:
每次选择序列中k个连续的数字,然后用这k个数字中最小的数字替换这k个数字中的每个数字。
我们希望进行了若干次操作后,序列中的每个数字都相等。请你找出需要操作的最少次数。

import java.util.Scanner;

public class Main { 
    public static void main(String[] args) {
        int result = 0;
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int l = sc.nextInt();
        String s = sc.nextLine();
        if (n == l) {
            System.out.println(1);
        } else {
            if (n > l) {
                //这里的1表示被减掉的l那部分是一次,剩下的每次都会有1个数是重复的,所以除以l-1
                result = (n - l) / (l - 1) + 1;
                //若是除完后还有余数,则还需要一次
                if ((n - l) % (l - 1) > 0) { 
                    result++;
                }
            }
            System.out.println(result);
        } 
    }
}

五、牛牛很喜欢玩接龙游戏,一天他突发奇想,发明了一种叫做“字符串链”的游戏。 这个游戏的规则是这样的,给出3个字符串A,B,C,如果它们满足以下两个条件,那么就可以构成一个“字符串链”:
1.A的最后一个字母和B的第一个字母相同;
2.B的最后一个字母和C的第一个字母相同。
现在牛牛给出了3个字符串A,B,C,希望你能判断这3个字符串能否构成一个“字符串链”,若能则输出“YES”,否则输出“NO”

import java.util.Scanner;

public class Main { 
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        String[] a = new String[10];
        for(int i = 0; i < 3; i++){
            a[i] = sc.next();
        }
        //因为已经固定了是3个字符串,还是比较简单的
        if(getlast(a[0])==getfirst(a[1])&& getlast(a[1])==getfirst(a[2])){
            System.out.println("YES");
        }
        else{
            System.out.println("NO");
        }        
    }     
    public static char getlast(String a){
        return a.charAt(a.length()-1);
    }     
    public static char getfirst(String a){
        return a.charAt(0);
    }               
}

你可能感兴趣的:(java)