字符串笔试题-算法笔试笔记(一)

本文记录了作者在笔试中遇到的字符串相关题目,包括腾讯的巧克力分块问题、字节跳动的IP地址划分、无重复字符的最长子串、最长非递减子序列及华为的大数相乘等,通过具体的解题思路和代码实现,探讨了递归、动态规划和滑动窗口等算法的应用。
摘要由CSDN通过智能技术生成

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值