前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一些算不算的题

一些算不算的题

原创
作者头像
WindWant
发布2023-05-24 11:11:45
2070
发布2023-05-24 11:11:45
举报
文章被收录于专栏:后端码事后端码事

一、最小查询成本

文件序列: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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、最小查询成本
  • 二、和目标数差最小的数列
  • 三、差异值和相似值差值
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档