1.前言
做了好几家公司的笔试编程题,其中涉及到了很多字符串的题,有做出来的也有没做出来后来上网学习大佬的代码的(有的还涉及到了最优解),于是在这里记录一下,加深自己的印象,题目是凭借的回忆,解决方法多数是参考的网络上其他的大佬。
2.字符串笔试题
腾讯笔试编程题的第二题(第三题是一个字符串的题,我太菜了实在是没有思路,最后放弃了),这个题难度不是很大,但是我自己的算法最后会提醒超出运行时间,只通过了百分之八十的测试用例,还是先记录一下,以后改了再更新博客。
题目的内容是:一排巧克力是由n个巧克力球组成的,有的巧克力球上面有榛果,现在要将这一排巧克力分成一个个小块,要求每个小块上有且只能有一个带榛果的小球,请问有多少种分法。输入有两行,第一行表示有n个巧克力球,第二行表示每一个巧克力求是否含有榛子,0代表没有,1代表有。输出有多少种分法。
思考:这个题我借鉴了之前的一道字符串划分IP地址的算法的思路,可以使用递归调用的方法,将巧克力分为已经分成小块的,还未分成小块的,再对还未划分成小块的巧克力递归调用划分算法,直到所有的巧克力都分完,方法数加1;问题的关键在于判断什么时候可以切分成小块。
我的思路是利用其没有榛果是0,有榛果是1的特性,可以遍历整个巧克力条,然后对巧克力球进行累加,累加和为0的时候继续累加;为1的时候继续累加,且此时可以切分,进行递归调用;为2的时候跳出循环。具体代码如下:
import java.util.Scanner;
public class Tengxun2 {
public static int count = 0 ;
public static void main(String[] args ){
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt() ;
int a[] = new int[n];
for( int i = 0 ; i < n ; i++ ){
a[i] = scanner.nextInt() ;
}
findways( 0 , a );
System.out.println(count);
}
public static void findways( int start , int a[]){
int temp = 0 ;
if( start == a.length ){
count++ ; //已经将所有的巧克力切分完成,方法数加1
}
else{ //从还未切分处进行遍历,累加巧克力球的值
for( int i =start ; i < a.length ; i ++ ){
temp+=a[i];
if( temp==1 ){
findways( i+1 , a); //切分巧克力,start从下一颗球开始
}
if( temp == 2){
break; //跳出循环
}
}
}
}
}
运行结果:
两种方式分别为 (10)(1)(1)以及(1)(01)(1)(1)
前面提到了字符串划分IP地址,这是字节跳动的笔试第三题(总共五个题)遇到的,输入是一行字符串,代表抹掉点的IP地址,输出是一个整数,表示原始可能的IP数量。
思考:我们可以将字符串划分为已经划分为IP地址的部分以及还未划分为IP地址的部位,然后遍历字符串,当数字的值是在0-255之间的时候,对剩余还未划分部分进行递归调用划分函数。同样当字符串划分到尾部的时候,方法数加1。还有一些小的细节具体见代码的注释:
import java.util.Scanner;
public class Test3 {
public static int count = 0 ;
public static void main (String []args){
Scanner sc