普及练习场 字符串处理 斯诺登的密码

题目链接

题意理解

这题是说,要把6个单词中的一部分转化成数字并对这些数字进行全排列。坑点的话,好像没有吧。就设计到一个 排列组合的写法,我差点没有想起来。还有虽然想了想写出来了,但是dfs的终止条件时对min处理的不好,可以修改min。总的来说,不难,但是要好好写。

代码

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class Main {
    static boolean[] visited = new boolean[6];
    static long min = 1000000000000l;
    static List<String> elements;
    public static void main(String[] args) {
        for(int i = 0; i < 6; i++) {
            visited[i] = false;
        }
        Map<String, Integer> numbers = new HashMap<>();
        String[] nums = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty"};
        for(int i = 0; i < nums.length; i++) {
            numbers.put(nums[i], i);
        }
        numbers.put("a", 1);
        numbers.put("both", 2);
        numbers.put("another", 1);
        numbers.put("first", 1);
        numbers.put("second", 2);
        numbers.put("third", 3);
        elements = new LinkedList<>();
        Scanner scanner = new Scanner(System.in);
        String word;
        for(int i = 0; i < 6; i++) {
            word = scanner.next().toLowerCase();
            if(numbers.containsKey(word)) {
                elements.add(itos((int)Math.pow(numbers.get(word), 2) % 100));
            }
        }
        scanner.close();
        dfs(elements.size(), elements.size(), "");
        if(min != 1000000000000l) {
            System.out.println(min);
        } else {
            return;
        }

    }

    private static void dfs(int maxn, int x, String s) {
        if(x == 0) {
            if(s.equals("")) {
                System.out.println(0);
                return;
            }
            long temp = stoi(s);
            if(temp < min) {
                min = temp;
            }
            return;
        }
        for(int i = 0; i < maxn; i++) {
            if(!visited[i]) {
                s += elements.get(i);
                visited[i] = true;
                dfs(maxn, x - 1, s);
                visited[i] = false;
                s = s.substring(0, s.length() - 2);
            }
        }
    }
    private static String itos(long x) {
        String result = String.valueOf(x);
        if(result.length() < 2) {
            result = "0" + result;
        }
        return result;
    }

    private static long stoi(String s) {
        while (s.startsWith("0")) {
            s = s.substring(1);
        }
        return Long.valueOf(s);
    }
}

欢迎加入“不会算法一群菜鸟”,群号是⑥⑥①⑨②2025,这是我设置的一道很低的门槛用来阻止广告的。入群的验证暗号是:我爱编译原理

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值