2024-08-23

题目描述:

给定一个矩阵,矩阵中的每个元素都是正整数,你可以从矩阵中选择一个子矩阵,这个子矩阵的每一列的数字都是递增的,子矩阵的宽度称为最小矩阵宽度。

请设计一个算法,找到子矩阵的最小矩形宽度。

输入:

输入包含多个测试用例,每个测试用例以矩阵的形式给出。

输出:

对于每个测试用例,输出最小矩形宽度。

解决方案:

对于每一列,我们需要找到第一个比它大的数字。如果没有,那么宽度为1;如果有,则宽度为两者之间的距离加一。我们可以使用单调递增栈来实现这个功能。

以下是使用单调栈解决这个问题的代码示例:

Java版本:




import java.util.Arrays;
import java.util.Scanner;
import java.util.Stack;
 
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            int rows = scanner.nextInt();
            int cols = scanner.nextInt();
            int[][] matrix = new int[rows][cols];
            for (int i = 0; i < rows; i++) {
                for (int j = 0; j < cols; j++) {
                    matrix[i][j] = scanner.nextInt();
                }
            }
            System.out.println(minMatrixWidth(matrix));
        }
        scanner.close();
    }
 
    public static int minMatrixWidth(int[][] matrix) {
        int n = matrix.length;
        int[][] nextGreater = new int[n][n];
        for (int i = 0; i < n; i++) {
            Stack<Integer> stack = new Stack<>();
            for (int j = 0; j < n; j++) {
                while (!stack.isEmpty() && matrix[stack.peek()][i] >= matrix[j][i]) {
                    stack.pop();
                }
                nextGreater[j][i] = stack.isEmpty() ? -1 : stack.peek();
                stack.push(j);
            }
        }
 
        int ans = Integer.MAX_VALUE;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (nextGreater[j][i] != -1) {
                    ans = Math.min(ans, nextGreater[j][i] - j + 1);
                }
            }
        }
        return ans == Integer.MAX_VALUE ? 0 : ans;
    }
}

JavaScript版本:




function minMatrixWidth(matrix) {
    let n = matrix.length;
    let nextGreater = new Array(n).fill(0).map(() => new Array(n).fill(-1));
    for (let i = 0; i < n; i++) {
        let stack = [];
        for (let j = 0; j < n; j++) {
            while (stack.length && matrix[stack[stack.length - 1]][i] >= matrix[j][i]) {
                stack.pop();
            }
            nextGreater[j][i] = stack.length === 0 ? -1 : stack[stack.length - 1];
            stack.push(j);
        }
    }
 
    let ans = Infinity;
    for (let i = 0; i < n; i++) {
        for (let j = 0; j < n; j++) {
2024-08-23

要获取一个月份的最后一天,可以创建一个新的Date对象,并将月份设置为该月的下一个月的第0天。在JavaScript中,日期对象的月份是从0开始的,即0代表1月,11代表12月,因此要获取1月的最后一天,应该设置月份为-1(即11)。以下是获取指定年份和月份的最后一天的函数示例:




function getLastDayOfMonth(year, month) {
  return new Date(year, month + 1, 0).getDate();
}
 
// 示例:获取2023年3月的最后一天
console.log(getLastDayOfMonth(2023, 2)); // 输出:31

这个函数接受两个参数:year(年份)和month(月份,0到11),然后返回该月的最后一天的日期数字。

2024-08-23



// 获取div元素
var box = document.getElementById('box');
 
// 鼠标按下事件绑定
box.addEventListener('mousedown', function(e) {
    // 阻止默认事件,防止选中文字等
    e.preventDefault();
    // 开始拖拽
    document.addEventListener('mousemove', move);
    // 鼠标抬起时停止拖拽
    document.addEventListener('mouseup', function() {
        document.removeEventListener('mousemove', move);
    });
 
    function move(e) {
        // 更新div的位置
        this.style.left = e.pageX + 'px';
        this.style.top = e.pageY + 'px';
    }
});

这段代码实现了一个基本的拖拽功能。当用户在box上按下鼠标时,开始监听鼠标移动事件并更新box的位置。当鼠标抬起时,停止监听鼠标移动事件。这里使用了addEventListenerremoveEventListener来动态地绑定和解绑事件处理函数,避免了不必要的事件监听,并且保持了代码的简洁性。

2024-08-23

使用Moment.js比较日期大小:




let date1 = moment('2023-04-01');
let date2 = moment('2023-04-02');
 
if (date1.isBefore(date2)) {
    console.log('date1 is before date2');
} else if (date1.isAfter(date2)) {
    console.log('date1 is after date2');
} else {
    console.log('date1 is the same as date2');
}

获取今日:




let today = moment();
console.log(today.format()); // 默认格式输出

昨日:




let yesterday = moment().subtract(1, 'days');
console.log(yesterday.format());

本周第一天(周日):




let startOfWeek = moment().startOf('week');
console.log(startOfWeek.format());

本月第一天:




let startOfMonth = moment().startOf('month');
console.log(startOfMonth.format());

本年第一天:




let startOfYear = moment().startOf('year');
console.log(startOfYear.format());

以上代码片段展示了如何使用Moment.js进行日期比较、获取特定日期以及格式化输出。

2024-08-23

Three.js:

  • 特点:强大的3D渲染引擎,适用于WebGL的2D和3D渲染。
  • 使用场景:复杂场景的可视化、VR/AR应用、数据可视化、游戏等。

Cesium:

  • 特点:基于WebGL的3D地理信息引擎,提供了强大的地理信息功能。
  • 使用场景:地图应用、GIS、3D地球、虚拟导航等。

Mapbox:

  • 特点:强大的地图渲染库,支持矢量图层和数据可视化。
  • 使用场景:数据驱动的地图应用、交通流可视化、物流跟踪等。

结合以上特点,可以根据实际需求选择合适的工具和库。例如,如果需要渲染复杂的3D场景,可以选择Three.js。如果涉及到地理信息的处理和展示,可以选择Cesium。而如果需要高质量的地图数据可视化,Mapbox是一个不错的选择。

2024-08-23

在Vue组件中,你可以使用计算属性(computed)来动态显示当前的系统日期、星期和时间。以下是一个简单的例子:




<template>
  <div>
    <p>当前日期: {{ currentDate }}</p>
    <p>星期: {{ currentWeekDay }}</p>
    <p>当前时间: {{ currentTime }}</p>
  </div>
</template>
 
<script>
export default {
  name: 'DateTimeComponent',
  computed: {
    currentDate() {
      return new Date().toDateString();
    },
    currentWeekDay() {
      const days = ['星期天', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
      return days[new Date().getDay()];
    },
    currentTime() {
      return new Date().toLocaleTimeString();
    }
  }
}
</script>

这个组件包含三个计算属性:currentDatecurrentWeekDaycurrentTime。它们分别返回当前日期、星期和时间。toDateString方法用于获取日期,getDay方法用于获取星期,而toLocaleTimeString用于获取时间。这些计算属性会在模板中显示,并且会随着时间的变化而更新。

2024-08-23

在JavaScript中,获取URL参数值有多种方法。以下是四种常见的方法:

  1. 使用window.location.searchURLSearchParams对象:



const params = new URLSearchParams(window.location.search);
const value = params.get('key'); // 替换'key'为你想获取的参数名
  1. 使用正则表达式解析查询字符串:



function getQueryParam(key) {
  const regex = new RegExp('[?&]' + key + '=([^&]*)');
  const match = regex.exec(window.location.search);
  return match && decodeURIComponent(match[1].replace(/\+/g, ' '));
}
const value = getQueryParam('key'); // 替换'key'为你想获取的参数名
  1. 使用split方法手动分割查询字符串:



function getQueryParam(key) {
  const query = window.location.search.substring(1);
  const params = query.split('&');
  for (const param of params) {
    const [paramKey, paramValue] = param.split('=');
    if (paramKey === key) {
      return decodeURIComponent(paramValue);
    }
  }
  return '';
}
const value = getQueryParam('key'); // 替换'key'为你想获取的参数名
  1. 使用URL接口和searchParams属性(需要浏览器支持):



const url = new URL(window.location.href);
const value = url.searchParams.get('key'); // 替换'key'为你想获取的参数名

以上四种方法可以根据需要选择使用,通常情况下推荐使用第一种方法,因为它简洁而且使用了现代浏览器内置的URLSearchParams对象。

2024-08-23



// 使用FileReader读取文件的简单示例
 
// 获取文件输入元素
const inputElement = document.getElementById('fileInput');
 
// 为输入元素添加事件监听器
inputElement.addEventListener('change', handleFile, false);
 
// 处理文件函数
function handleFile() {
  const file = inputElement.files[0]; // 获取文件
  if (!file) {
    console.log('未选择文件');
    return;
  }
 
  const reader = new FileReader(); // 创建FileReader实例
 
  // 设置文件读取完毕后的回调函数
  reader.onload = function(event) {
    const content = event.target.result;
    console.log('文件内容:', content); // 输出文件内容
  };
 
  // 设置读取文件过程中的回调函数(可选)
  reader.onprogress = function(event) {
    if (event.loaded && event.total) {
      console.log('读取进度:', (event.loaded / event.total) * 100 + '%');
    }
  };
 
  // 设置读取错误后的回调函数(可选)
  reader.onerror = function(error) {
    console.log('读取文件时发生错误:', error);
  };
 
  // 读取文件为文本
  reader.readAsText(file, 'UTF-8'); // 可以通过指定编码来读取文本文件
}

这段代码演示了如何使用FileReader API读取用户通过文件输入选择的文件。它包括了创建FileReader实例、为其设置不同的事件监听器以及如何读取文件内容。在实际应用中,可以根据需要读取文件为数组缓冲区(readAsArrayBuffer)、DataURL(readAsDataURL)或者二进制字符串(readAsBinaryString)等形式。

2024-08-23

报错解释:

这个报错表明你在尝试导入一个名为qqmap-wx-jssdk.js的小程序腾讯地图SDK文件时失败了。通常这种情况下,可能是因为文件不存在、路径错误或者文件没有正确地被添加到项目中。

解决方法:

  1. 确认文件是否存在:检查你的项目目录中是否确实有qqmap-wx-jssdk.js这个文件。
  2. 检查路径:确保你在导入文件时使用的路径是正确的。如果文件在项目的子目录中,需要相对路径或绝对路径正确指向它。
  3. 检查是否已添加到项目:如果你是通过npm或其他方式引入的,确保已经正确安装并在项目配置中引用了该SDK。
  4. 查看文档和示例:参考腾讯地图小程序SDK的官方文档和示例,确保你的导入方式是按照要求进行的。
  5. 清理缓存:有时候IDE或者开发工具的缓存可能会导致无法识别文件,尝试清理缓存后重新编译。
  6. 权限问题:确保你有权限访问该文件,特别是在多用户系统或者团队开发环境中。

如果以上步骤都无法解决问题,可以尝试联系腾讯地图的技术支持或者查看社区是否有其他开发者遇到类似问题的解决方案。

2024-08-23

在Vite项目中,你可以通过修改vite.config.js文件来配置打包后的JS文件名,从而有效地解决更新后浏览器缓存的问题。

以下是一个配置示例,它使用了环境变量来为不同环境生成不同的文件名,以此来确保缓存效果:




import { defineConfig } from 'vite';
import path from 'path';
 
export default defineConfig(({ mode }) => {
  // 根据模式不同生成不同的hash
  const isProduction = mode === 'production';
  const hash = isProduction ? '.[contenthash:8]' : '';
 
  return {
    build: {
      // 输出配置
      // 通过模板字符串设置JS文件名
      // 生产环境使用内容哈希,开发环境使用时间戳
      chunkFileName: `${isProduction ? 'chunk-[name]' : 'chunk-[name]-[hash]'}${hash}.js`,
      assetsDir: 'assets',
      rollupOptions: {
        output: {
          entryFileNames: `${isProduction ? '[name]' : '[name]-[hash]'}${hash}.js`,
          chunkFileNames: `${isProduction ? '[name]' : '[name]-[hash]'}${hash}.js`,
          assetFileNames: `${isProduction ? '[name]' : '[name]-[hash]'}${hash}[extname]`,
        },
      },
    },
  };
});

在这个配置中:

  • chunkFileName 用于配置非入口chunk的文件名。
  • entryFileNameschunkFileNames 分别用于配置入口chunk和非入口chunk的文件名。
  • assetFileNames 用于配置静态资源文件的文件名。

生产环境中,文件名包含内容哈希,可以确保文件内容变化时,文件名也会改变,从而避免了浏览器缓存问题。开发环境中,文件名包含时间戳,可以确保每次构建都有独一无二的文件名,避免了缓存。