CVTE笔试编程笔记

来源:互联网 发布:淘桃美工 编辑:程序博客网 时间:2024/05/21 12:47

前几天参加了CVTE 的在线笔试,由于不小心把岗位填错了,所以只能硬着头皮去笔试,果然选择题就跪了=。=,后面是两道编程题,题目不难,虽然在考试的时候还做错了,这两天有空就整理了一下,方便以后自己可以看一看。

编程1:(大致题目)输入某一字符串,输出该字符串中包含有几个“CVTE”的字样(忽略大小写),例:“WELCOME TO CVTE,COME ON CVTE”,OUTPUT: 2
当时的解题思路:利用String 自带的方法indexOf()找到第一个出现的位置,标记此位置作为fromIndex继续往下找,第一反应是递归,后来整理的时候发现其实不用这么麻烦。最终整理出来的结果直接用一个变量来标识代替递归的想法。还有另一种方法就是利用 java.util.regex.Matcher.find() 方法用正则表达式进行处理。

public static int appearNumberRegex(String srcText, String findText) {        int count = 0;        Pattern p = Pattern.compile(findText);        Matcher m = p.matcher(srcText);        while (m.find()) {            count++;        }        return count;    }    public static int appearNumber(String inputText, String findText) {        int count = 0;        int index = 0;        if(inputText==null || inputText.length()==0 || findText.length()==0) return 0;        findText = findText.toLowerCase();        while ((index = inputText.toLowerCase().indexOf(findText, index)) != -1) {            index = index + findText.length();            count++;        }        return count;    }

编程2:(大致题目)输入一个偶数记为M,程序输出两个素数记为P1,P2,要求两个素数之和等于输出偶数,且两个素数之差是所有和为该偶数中的素数中最小的一对。例:输入18 ,满足第一个要求的素数对有5/13、7/11,最终输出的应该是7/11。
当时的解题思路:应该弄两个循环,判断两个素数,用一个变量来存放两个素数的差值,假设第一对找到的差值是最小的,用两个变量将值存入起来,第二次再进行比较,直到循环结束。一开始两个循环的起始值都是2,后来整理的时候发现还可以再优化,内层循环可以直接从M/2从始。(补充:素数 >2 且除1和本身外不能被其他数整除)

private void GetPrimeNumber(int evenNumber){        long start = System.currentTimeMillis();        int min = evenNumber;        int temp = 0;        int x=0;        int y=0;        if(evenNumber <2) return;        for (int i=2; i<evenNumber/2; i++){            for(int j=evenNumber/2; j<=evenNumber; j++){   //从evenNumber/2 开始可以提高效率                if(isPrimeNumber(i) && isPrimeNumber(j) && i+j==evenNumber){                    temp = j-i;                    if(min > temp){                        x= i;                        y= j;                        min = temp;                    }                }            }        }        if(x!=0 && y!=0){            System.out.println(x+", "+y);        }        long speech = System.currentTimeMillis() - start;        System.out.println(speech);    }    /*     * return true if is prime number     */    private boolean isPrimeNumber(int input){        boolean isPrime = true;        for (int i=2; i<Math.sqrt(input); i++){            if(input%i==0){                isPrime = false;                break;            }        }        return isPrime;    }

今天发现编程1还有更简单的解法,可以利用org.apache.commons.lang3.StringUtils 提供的方法countMathes()直接返回出现次数。

private static int appearNumberStringUtils(String inputString,String findText){        if(inputString==null || inputString.length()==0 || findText==null || findText.length()==0) return 0;        return StringUtils.countMatches(inputString.toLowerCase(), findText.toLowerCase());    }
0 0