2022-07-11:给定n位长的数字字符串和正数k,求该子符串能被k整除的子串个数。
(n<=1000,k<=100)。
来自微众。4.11笔试。

答案2022-07-11:

动态规划。假设abcdef%k=0,abc000%k=0,那么def%k=0。

代码用rust编写。代码如下:

use rand::Rng;
fn main() {
let nn: i64 = 18;
let kk: i64 = 20;
let test_time: i32 = 3000;
println!("测试开始");
for i in 0..test_time {
let str = random_number(rand::thread_rng().gen_range(0, nn) + 1);
let k = rand::thread_rng().gen_range(0, kk) + 1;
let ans1 = mod_ways1(&str, k);
let ans2 = mod_ways2(&str, k);
if ans1 != ans2 {
println!("出错了!{}", i);
println!("ans1 = {}", ans1);
println!("ans2 = {}", ans2);
break;
}
}
println!("测试结束");
} // 暴力方法
// 为了验证
fn mod_ways1(s: &str, k: i64) -> i64 {
let n = s.len() as i64;
let mut ans = 0;
for i in 0..n {
for j in i..n {
if (&s[i as usize..(j + 1) as usize]).parse::<i64>().unwrap() % k == 0 {
ans += 1;
}
}
}
return ans;
} // 正式方法
// 时间复杂度O(N * k)
fn mod_ways2(s: &str, k: i64) -> i64 {
let mut cur: Vec<i64> = vec![];
for _ in 0..k {
cur.push(0);
}
// 帮忙迁移
let mut next: Vec<i64> = vec![];
for _ in 0..k {
next.push(0);
}
// 0...i 整体余几?
let mut mod0: i64 = 0;
// 答案:统计有多少子串的值%k == 0
let mut ans = 0;
for cha in s.bytes() {
for i in 0..k {
// i -> 10个
// (i * 10) % k
next[((i * 10) % k) as usize] += cur[i as usize];
cur[i as usize] = 0;
}
let mut tmp = cur.clone();
cur = next.clone();
next = tmp.clone();
mod0 = (mod0 * 10 + (cha - '0' as u8) as i64) % k;
ans += if mod0 == 0 { 1 } else { 0 } + cur[mod0 as usize];
cur[mod0 as usize] += 1;
}
return ans;
} // 为了测试
fn random_number(n: i64) -> String {
let mut ans: Vec<u8> = vec![];
for _i in 0..n {
ans.push('0' as u8 + rand::thread_rng().gen_range(0, 10));
}
return String::from_utf8(ans).unwrap();
}

执行结果如下:


左神java代码

2022-07-11:给定n位长的数字字符串和正数k,求该子符串能被k整除的子串个数。 (n<=1000,k<=100)。 来自微众。4.11笔试。的更多相关文章

  1. lumen 5.6 设置APP_KEY为32位长的随机字符串

    在 App\Console\Commands下 添加以下内容的KeyGenerateCommand.php文件 <?php namespace App\Console\Commands; use ...

  2. sql中保留一位小数的百分比字符串拼接,替换函数,换行符使用

    select  num ,cast(round(convert(float,isnull((a.Sum_Num-d.Sum_Num),0))/convert(float,c.Sum_Store_Num ...

  3. HJ92 在字符串中找出连续最长的数字串

    描述 输入一个字符串,返回其最长的数字子串,以及其长度.若有多个最长的数字子串,则将它们全部输出(按原字符串的相对位置) 本题含有多组样例输入. 输入描述: 输入一个字符串. 输出描述: 输出字符串中 ...

  4. 介绍C++11标准的变长参数模板

    目前大部分主流编译器的最新版本均支持了C++11标准(官方名为ISO/IEC14882:2011)大部分的语法特性,其中比较难理解的新语法特性可能要属变长参数模板(variadic template) ...

  5. 11-C语言指针&一维数组&字符串

    一.用指针遍历数组元素 1.最普通的遍历方式是用数组下标来遍历元素 1 // 定义一个int类型的数组 2 int a[4] = {1, 2, 3, 4}; 3 4 int i; 5 for (i = ...

  6. 机器学习入门-数值特征-数据四分位特征 1.quantile(用于求给定分数位的数值) 2.plt.axvline(用于画出竖线) 3.pd.pcut(对特征进行分位数切分,生成新的特征)

    函数说明: 1.  .quantile(cut_list) 对DataFrame类型直接使用,用于求出给定列表中分数的数值,这里用来求出4分位出的数值 2.  plt.axvline()  # 用于画 ...

  7. 剑指offer——面试题11:旋转数组的最小数字

    #include"iostream" using namespace std; int GetMinNumber(int *data,int len) { ,right=len-, ...

  8. 用POI导出excel时,较长的数字不想被自动变为科学计数法的解决方式(转)

    做过很多次导出excel了.都碰到一个问题,内容里如果包含一个比较长的数字,比如订单号“2546541656596”,excel会自动变成科学计数法... 弄过好几次都没有解决,最近又要导出excel ...

  9. Java随机生成定长纯数字或数字字母混合数

    (转)Java随机生成定长纯数字或数字字母混合数 运行效果图: 具体实现代码

  10. 最长回文字符串(manacher算法)

    偶然看见了人家的博客发现这么一个问题,研究了一下午, 才发现其中的奥妙.Stupid. 题目描述:      回文串就是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串. ...

随机推荐

  1. java中取数组第一个元素

    java中取数组第一个元素   var a=[1,2,2,3,4];console.log(a);a.shift();console.log(a);   pop:删除原数组最后一项,并返回删除元素的值 ...

  2. django 批量提交

    https://www.cnblogs.com/lbzbky/articles/11792545.html

  3. reduce处理相同id合并对象内容为数组

    例: let arr = [     {         situationId: '666666666666666666666',         cloundClass: '999',     } ...

  4. mac git远程仓库错误解决方法

    mac更新后不知道怎么回事,git时出现了 Permission denied (publickey). 经查询后得出原因 1.首先给git进行config的配置 git config --globa ...

  5. Java学习小总结它又又又又来啦!

    又到了输出总结的时候啦,话不多说,直接开始输出! 一.final final修饰符的主要作用就是强调它所修饰的板块的"最后"性: 若是修饰成员方法:那么成员方法不可以再被重写: 若 ...

  6. Spring--bean管理(easy)

    bean作用范围 利用同一个BookDao设置出来两个不同的对象,得到相同的地址: (默认为单例,即表现为同一个地址) 要是想要得到不同的地址,就需要我们在接口实现类的上面加上这样一个注解:(双例) ...

  7. 使用Nginx实现本地目录映射

    如果文件是存储在服务器的某个位置,想提供pdf.jpg.png.mp4这些文件的预览功能,可以使用Nginx做虚拟映射,防止他人知道该文件的绝对路径. 如果想预览office文件,先将office文件 ...

  8. 第一章C语言概述

    1.1程序实例 //first.程序 #include <stdio.h> int main() { int num; num = 1; printf("I am a simpl ...

  9. DSLinux介绍

    本发行版 名字叫 Damn Small Linux 整个磁盘大小是40多M, 相对于如今几十G起步的操作系统(对, 就是你Windows), 确实太tm小了 Kernel版本是2.4.26, 2004 ...

  10. Go 语言:通过TDD测试驱动开发学习 Mocking (模拟)的思想

    正文: 现在需要你写一个程序,从 3 开始依次向下,当到 0 时打印 「GO!」 并退出,要求每次打印从新的一行开始且打印间隔一秒的停顿. 3   2   1   Go!   我们将通过编写一个 Co ...