给定一个设备编号区间[start, end],包含4或18的编号都不能使用,如:418、148、718不能使用,108可用

一、题目描述

给定一个设备编号区间[start, end],包含4或18的编号都不能使用,如:418、148、718不能使用,108可用。请问有多少可用设备编号?

解答要求

时间限制:1000ms, 内存限制:256MB

输入

两个整数start end(单空格间隔),用于标识设备编号区间,0 < start < end <= 100000

输出

一个整数,代表可用设备编号的数量

样例
输入样例 1

3 20

输出样例 1

15

提示
不能使用的设备编号为4、14、18

二、代码模板

import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import static java.lang.System.in;

public class Main {
    public static void main(String[] args) {
        Scanner cin = new Scanner(in, StandardCharsets.UTF_8.name());
        int start = cin.nextInt();
        int end = cin.nextInt();
        cin.close();

        System.out.println(getNormalDeviceNum(start, end));
    }

    // 待实现函数,在此函数中填入答题代码
    private static int getNormalDeviceNum(int start, int end) {
        return 0;
    }
}

三、个人代码结果

import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import static java.lang.System.in;

public class Main {
    public static void main(String[] args) {
        Scanner cin = new Scanner(in, StandardCharsets.UTF_8.name());
        int start = cin.nextInt();
        int end = cin.nextInt();
        cin.close();

        System.out.println(getNormalDeviceNum(start, end));
    }

    // 待实现函数,在此函数中填入答题代码
    private static int getNormalDeviceNum(int start, int end) {
        int count =0;
        for (int i = start; i <= end; i++) {
            //拆分I
            int sw = i / 100000;
            int i1 = i % 100000;
            int w = i1 / 10000;
            int i2 = i1 % 10000;
            int q = i2 / 1000;
            int i3 = i2 % 1000;
            int b = i3 / 100;
            int i4 = i3 % 100;
            int s = i4 / 10;
            int g = i4 % 10;
            List<Integer> list = new ArrayList<>();
            list.add(sw);
            list.add(w);
            list.add(q);
            list.add(b);
            list.add(s);
            list.add(g);
            if (list.contains(4)){
                continue;
            }else if (list.get(0)*10+list.get(1)==18){
                continue;
            }else if (list.get(1)*10+list.get(2)==18){
                continue;
            }else if (list.get(2)*10+list.get(3)==18){
                continue;
            }else if (list.get(3)*10+list.get(4)==18){
                continue;
            }else if (list.get(4)*10+list.get(5)==18){
                continue;
            }else{
                count +=1;
            }

        }
        return count;
    }
}

四、优化思路
直接简单粗暴的循环star与end之间的所有的数据,会有很多不必要的循环。
如:

含有4含有18
418
40~49180~189
400~4991800~1899
4000~499918000~18999

设计避开不必要的循环,也是提高效率的途径。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用前缀和来解决这个问题。首先,计算出给定数组的前缀和数组,记为prefix_sum。然后,遍历前缀和数组,并使用哈希表来保存每个前缀和对应的索引。 在遍历前缀和数组的过程中,如果当前前缀和可以被n整除,那么整个数组就是一个满足条件的区间,记录它的起始索引和结束索引。否则,如果当前前缀和已经在哈希表中出现过,说明存在一个区间的和可以被n整除,该区间的起始索引为哈希表中上次出现的索引加1,结束索引为当前索引。 最后,根据得到的起始索引和结束索引,即可得到最大区间。 以下是用Python实现的代码示例: ```python def find_max_interval(arr): prefix_sum = [0] * (len(arr) + 1) for i in range(1, len(prefix_sum)): prefix_sum[i] = (prefix_sum[i - 1] + arr[i - 1]) % n max_len = 0 interval_start = 0 interval_end = 0 prefix_sum_hash = {} for i in range(len(prefix_sum)): if prefix_sum[i] == 0: max_len = i interval_start = 0 interval_end = i - 1 elif prefix_sum[i] in prefix_sum_hash: if i - prefix_sum_hash[prefix_sum[i]] > max_len: max_len = i - prefix_sum_hash[prefix_sum[i]] interval_start = prefix_sum_hash[prefix_sum[i]] + 1 interval_end = i - 1 else: prefix_sum_hash[prefix_sum[i]] = i return interval_start, interval_end # 示例 arr = [4, 3, 1, 6, 7] n = 3 start, end = find_max_interval(arr) print("最大区间起始索引:", start) print("最大区间结束索引:", end) ``` 这段代码的时间复杂度为O(n),其中n是给定数组的长度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值