一些算不算的题

2023-05-24 11:11:45 浏览数 (1)

一、最小查询成本

文件序列:a1、a2 ... an  非限定有序、重复

加载成本:l1、l2 ... ln

缓存成本:c 

文件查询可以直接加载或则从缓存里获取。

代码语言:javascript复制
/**
  *
  * @param f 文件序列
  * @param lc 加载成本序列
  * @param c 单个文件缓存成本
  */
 public static void minCost(int[] f, int[] lc, int c) {
     Map<Integer, Integer> flc = new HashMap<>(); //加载成本映射
     Map<Integer, Integer> fls = new HashMap<>(); //文件数统计
     for (int i = 0; i < f.length; i  ) {
         flc.put(f[i], lc[i]);
         fls.put(f[i], fls.getOrDefault(f[i], 0)   1);
     }
 
     int sumCost = 0;
     for (Map.Entry<Integer, Integer> entry: flc.entrySet()) {
         int slc = entry.getValue() * fls.get(entry.getKey());
         int scc = fls.get(entry.getKey())   c;
 
         sumCost  = Math.min(slc, scc);
     }
 
     System.out.println(sumCost);
 } 

测试数据:

文件序列:1, 2, 3, 4, 3, 2, 2  

加载成本:1, 1, 1, 1, 1, 1, 1

缓存成本:5

测试结果:7

二、和目标数差最小的数列

数列:a1、a2 ... an  非限定有序

目标数:t

结果数列个数:m

代码语言:javascript复制
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
 
/**
 *
 * @param arr 数序列
 * @param target  目标数
 * @param count 结果数个数
 */
public static void shortDiffArr(int[] arr, int target, int count) {
    Arrays.sort(arr);
    Map<Integer, Integer> indexAndDiff = new HashMap<>();
    for (int i = 0; i < arr.length; i  ) {
        indexAndDiff.put(i, Math.abs(arr[i] - target));
    }
 
    String result = indexAndDiff.entrySet().stream()
            .sorted(Comparator.comparingInt(Map.Entry::getValue)).limit(count)
            .sorted(Comparator.comparingInt(Map.Entry::getKey))
            .map(value -> String.valueOf(arr[value.getKey()]))
            .collect(Collectors.joining(" "));
    System.out.println(result);
}

测试数据:

3, 4, 8, 6, 7, 5, 10 

5

输出结果:

4 5 6 7 8

三、差异值和相似值差值

两个正整数的二进制标示:

差异值:同一个二进制位不同,则结果取 1,相同则取 0

相似值:同一个二进制位都为 1 则取 1,其它取 0

判断差异值和相似值差值是否大于某个值

代码语言:javascript复制
/**
 *
 * @param a
 * @param b
 */
public static void difAndFam(int a, int b) {
    String ba = Integer.toBinaryString(a);
    String bb = Integer.toBinaryString(b);
 
    ba = String.format("%0"   (31 - ba.length())   "d", 0)   ba;
    bb = String.format("%0"   (31 - bb.length())   "d", 0)   bb;
 
    StringBuilder sbd = new StringBuilder();
    StringBuilder sbf = new StringBuilder();
    for (int i = 0; i < ba.length(); i  ) {
        sbd.append(ba.charAt(i) != bb.charAt(i) ? 1 : 0);
        sbf.append(ba.charAt(i) - '0' == 1 && bb.charAt(i) - '0' == 1 ? 1 : 0);
    }
 
    int result = Integer.parseInt(sbd.toString(), 2) - Integer.parseInt(sbf.toString(), 2);
    System.out.println(result);
}

测试数据:234551 43434

测试结果:179579

0 人点赞