【48天笔试强训】day19

题目1: 

描述

某商店规定:三个空汽水瓶可以换一瓶汽水,允许向老板借空汽水瓶(但是必须要归还)。

小张手上有n个空汽水瓶,她想知道自己最多可以喝到多少瓶汽水。

数据范围:输入的正整数满足 1≤�≤100 1≤n≤100 

注意:本题存在多组输入。输入的 0 表示输入结束,并不用输出结果。

输入描述:

输入文件最多包含 10 组测试数据,每个数据占一行,仅包含一个正整数 n( 1<=n<=100 ),表示小张手上的空汽水瓶数。n=0 表示输入结束,你的程序不应当处理这一行。

输出描述:

对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出0。

示例1

输入:

3
10
81
0

复制输出:

1
5
40

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        int num=0;
        while((num=in.nextInt())!=0){
           System.out.println(getNum(num));
        }
    }

    public static int getNum(int n){
        int sum=0;
        //n为剩余瓶子的总数
        while(n>1){
           //每3个瓶子就可以换一个,因此可以先分为3个一组
           sum+=n/3;
           //分成的3个换成了一个空瓶,剩余瓶子的总数等于换来的+剩下的
           n=n/3+n%3;
           //n为2的时候自增1
           if(n==2){
               sum++;
               break;
           }
        }
        return sum;
    }
}

题目2:

HJ65 查找两个字符串a,b中的最长公共子串

  • 题目
  • 题解(368)
  • 讨论(461)
  • 排行
  • 面经

    new

中等  通过率:32.11%  时间限制:1秒  空间限制:32M

知识点字符串

 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。

描述

查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。

注:子串的定义:将一个字符串删去前缀和后缀(也可以不删)形成的字符串。请和“子序列”的概念分开!

数据范围:字符串长度1≤�����ℎ≤300 1≤length≤300 

进阶:时间复杂度:�(�3) O(n3) ,空间复杂度:�(�) O(n) 

输入描述:

输入两个字符串

输出描述:

返回重复出现的字符

示例1

输入:

abcdefghijklmnop
abcsafjklmnopqrstuvw

复制输出:

jklmnop

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        String a=in.next();
        String b=in.next();
        if(a.length()<b.length()){
            System.out.println(findLongestCommonSubstring(a,b));
        }else{
            System.out.println(findLongestCommonSubstring(b,a));
        }
    }

    public static String findLongestCommonSubstring(String a, String b) {  
        int m = a.length();  
        int n = b.length();  
          
        // dp[i][j]表示a的前i个字符和b的前j个字符之间的最长公共后缀长度  
        int[][] dp = new int[m + 1][n + 1];  
        int maxLength = 0; // 最长公共子串的长度  
        int startIndex = 0; // 最长公共子串在a中开始的位置 
  
        // 动态规划求解  
        for (int i = 1; i <= m; i++) {  
            for (int j = 1; j <= n; j++) {  
                if (a.charAt(i - 1) == b.charAt(j - 1)) {  
                    dp[i][j] = dp[i - 1][j - 1] + 1;  
                    if (dp[i][j] > maxLength) {  
                        maxLength = dp[i][j];  
                        startIndex=i-maxLength;
                    }  
                }  
            }  
        }  
  
        // 如果找到最长公共子串,返回该子串;否则返回空字符串  
        return  a.substring(startIndex, startIndex+maxLength); 
    }
}

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值