2017.6.4测试 题一 k好数

本篇博客介绍了一个使用Pascal编程语言解决的问题:读取两个整数n和k,然后计算从1到n中所有不超过k的数字组成的整数个数。通过双重循环和条件判断实现了这一功能。

var
 s:string;
 n,k,i,j,t,p,ans:longint;
begin
 readln(n,k);
 for i:=1 to n do
  begin
   p:=0;
   str(i,s);
   for j:=1 to length(s) do//每一位
    if ord(s[j])-48>k then begin//如果有一位大于就退出
                            p:=1;//标记
                            break;
                           end;
   if p=0 then inc(ans);//没有就加1
  end;
 writeln(ans);
end.

### 2017年Java开发者测试决赛试分析 根据已知信息,虽然没有直接提及2017年Java开发者测试决赛的具体试内容,但可以结合类似赛事的目类型和背景进行推测[^1]。通常,开发者测试竞赛的试会涵盖算法设计、据结构应用以及编程语言特性等多个方面。以下是基于相关竞赛型构建的个可能的试示例: #### 示例试 **目:字符串匹配优化问** 给定个字符串 `S` 和多个模式字符串 `P1, P2, ..., Pk`,要求实现个高效的算法来判断每个模式字符串是否为字符串 `S` 的子串,并返回所有匹配的位置。 - 输入格式: - 第行包含个整 `N`,表示字符串 `S` 的长度。 - 第二行包含字符串 `S`。 - 第三行包含个整 `K`,表示模式字符串的量。 - 接下来 `K` 行,每行包含个模式字符串 `Pi`。 - 输出格式: - 对于每个模式字符串 `Pi`,输出行,包含所有匹配位置的起始索引(从0开始),用空格分隔。如果没有匹配,则输出 `-1`。 - 示例输入: ```plaintext 15 abracadabraabrac 3 abra cad xyz ``` - 示例输出: ```plaintext 0 7 11 4 -1 ``` - 约束条件: - `1 <= N <= 10^6` - `1 <= K <= 10^5` - 每个模式字符串的长度不超过 `100`。 #### 参考代码实现 以下是个基于后缀组的高效解决方案[^2]: ```java import java.util.*; public class StringMatching { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int N = scanner.nextInt(); String S = scanner.next(); int K = scanner.nextInt(); List<String> patterns = new ArrayList<>(); for (int i = 0; i < K; i++) { patterns.add(scanner.next()); } // 构建后缀组 int[] suffixArray = buildSuffixArray(S); // 查询每个模式字符串 for (String pattern : patterns) { List<Integer> positions = search(S, suffixArray, pattern); if (positions.isEmpty()) { System.out.println(-1); } else { for (int pos : positions) { System.out.print(pos + " "); } System.out.println(); } } } private static int[] buildSuffixArray(String S) { int n = S.length(); Integer[] order = new Integer[n]; for (int i = 0; i < n; i++) { order[i] = i; } Arrays.sort(order, Comparator.comparingInt(i -> S.charAt(i))); return Arrays.stream(order).mapToInt(Integer::intValue).toArray(); } private static List<Integer> search(String S, int[] suffixArray, String pattern) { List<Integer> result = new ArrayList<>(); int left = 0, right = suffixArray.length; while (left < right) { int mid = (left + right) / 2; if (S.substring(suffixArray[mid]).startsWith(pattern)) { result.add(suffixArray[mid]); break; } else if (S.substring(suffixArray[mid]).compareTo(pattern) < 0) { left = mid + 1; } else { right = mid; } } return result; } } ``` ### 解思路说明 上述代码通过构建后缀组来加速字符串匹配过程。后缀组是种经典的字符串处理技术,能够显著降低多模式匹配的时间复杂度[^2]。此外,该方法还利用了二分查找以进步提高效率。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值