9. 回文数(leetcode)

本文介绍如何判断一个整数是否为回文数,即正序和倒序读都相同的整数。提供了两种方法,一种使用vector辅助结构,另一种直接通过数学运算实现,不转换为字符串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

示例 1:
输入:
121
输出: true

示例 2:
输入:
-121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

示例 3:
输入:
10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。

 

解决方案

方法一:

利用一个辅助的数据结构vector来进行判断,即将整数x的每一位通过取余的操作提取出来,存放到vector中,然后再进行判断。

class Solution {
public:
    bool isPalindrome(int x) {
        vector<int> v;
        if(x < 0)
            return false;
        while(x!=0)
        {
            v.push_back(abs(x%10));
            x = x/10;
        }
        int j = v.size()-1;
        for(int i=0;i<=j;i++,j--)
        {
            if(v[i] == v[j])
                continue;
            else
                return false;
        }
        return true;
    }
};

方法二:

这道验证回文数字的题如果将数字转为字符串,就变成了验证回文字符串的题,没啥难度了,我们就直接来做follow up吧,不能转为字符串,而是直接对整数进行操作。我们可以利用取整和取余来获得我们想要的数字,比如1221,如果计算 1221 / 1000, 则可得首位1, 如果 1221 % 10, 则可得到末尾1,进行比较,然后把中间的22取出来继续进行比较。

class Solution {
public:
    bool isPalindrome(int x) {
        if(x<0)
            return false;
        int div = 1;
        while(x / div >= 10)
            div = div * 10;
        while(x>0)
        {
            int left = x / div;
            int right = x % 10;
            if(left != right)
                return false;
            x = (x % div) / 10;
            div = div / 100;
        }
        return true;
    }
};

 

<think>好的,用户想知道如何通过JavaScript获取B视频的真实播放URL。首先,我需要回忆一下B视频加载机制。B可能和西瓜视频类似,使用音视频分离或者动态加载资源。根据引用[1]中的例子,西瓜视频是通过JavaScript在控制台执行命令来获取视频和音频地址的,可能B也有类似的结构。 接下来,用户提到想用JavaScript,所以可能需要分析B页面加载后的数据对象。通常这类网会把视频信息存储在全局变量中,比如window对象下的某个属性。需要找到存储视频资源的路径。比如在引用[1]中,西瓜视频用的是window._SSR_HYDRATED_DATA,B可能也有类似的变量。 然后,考虑B视频播放器结构。B使用HTML5播放器的话,视频资源可能通过blob URL或者动态加载的m3u8、mpd文件。如果是blob,直接获取可能较难,但如果是动态加载的,可能在网络请求中找到视频地址。这时候可能需要用开发者工具查看XHR请求,找到视频的真实URL。不过用户希望用JavaScript直接获取,所以可能需要从页面内的对象中提取。 另外,引用[3]中的例子用了Image对象获取宽高,可能类似的方法可以应用到视频元素上。比如,查找页面中的video元素,然后获取其src属性。但B的video标签可能使用的是blob URL,这时候直接获取src可能不奏效,因为blob URL是临时的。 然后想到B的API结构。可能需要找到视频的初始化数据,比如通过页面中的script标签查找__INITIAL_STATE__这样的变量,里面可能包含视频的详细信息,包括不同清晰度的URL。例如,在页面源码中搜索__playinfo__或者__INITIAL_STATE__,这些对象里可能有视频和音频的地址。 另外,引用[4]中提到了通过API获取真实URL的方法,但用户这里可能需要绕过API直接通过前端JavaScript获取。可能需要分析B页面加载时的网络请求,找到获取视频地址的接口,然后模拟这个请求。但跨域问题可能存在,因此可能需要使用浏览器扩展或者后端代理。 综合这些,可能的步骤是:1. 打开B视频页面,打开开发者工具,查看网络请求,找到视频地址的来源。2. 在控制台中尝试访问全局变量,如window.__playinfo,看看是否有视频数据。3. 解析该对象,提取出视频和音频的URL。例如,可能像window.__playinfo__.data.dash.video[0].baseUrl这样的路径。4. 处理可能的加密参数,比如添加Referer头或者sign参数,以确保能直接访问URL。 需要注意的是,B可能会对视频地址进行防盗链处理,直接获取的URL可能需要携带特定的请求头才能访问。此外,B的接口可能会变化,所以这种方法可能需要定期更新。最后,用户可能需要使用浏览器控制台执行这些脚本,或者开发浏览器插件来实现自动化。</think>要获取B视频的真实播放地址,可以通过分析页面加载的全局对象或网络请求实现。以下是具体方法及注意事项: ### 一、通过全局对象获取 1. **打开开发者工具**:在B视频播放页面按F12打开控制台 2. **查找视频数据对象**:B视频信息通常存储在`window.__playinfo__`对象中 ```javascript // 获取视频数据对象 const playInfo = window.__playinfo__; // 提取最高清晰度视频地址 const videoUrl = playInfo.data.dash.video[0].baseUrl; // 提取音频地址 const audioUrl = playInfo.data.dash.audio[0].baseUrl; ``` ### 二、通过网络请求分析 1. **过滤m4s请求**:在开发者工具的Network标签中过滤`m4s`类型请求 2. **复制真实地址**:找到`video.m4s`和`audio.m4s`的请求URL,形如: ``` https://upos-sz-mirrorali.bilivideo.com/xxxxx/xxxxx/video.m4s?expires=xxx&sign=xxx ``` ### 、注意事项 1. **防盗链机制**:直接获取的URL需要携带`Referer: https://www.bilibili.com`请求头才能访问[^2] 2. **动态签名**:URL中的`sign`参数具有时效性(通常有效30分钟),过期后需重新获取[^4] 3. **分辨率选择**:`window.__playinfo__.data.dash.video`数组包含不同分辨率选项,索引0为最高清 ### 四、完整示例代码 ```javascript function getBiliVideoUrl() { if (!window.__playinfo__) { console.error('未找到视频数据对象'); return null; } const videos = window.__playinfo__.data.dash.video; const audios = window.__playinfo__.data.dash.audio; return { video: videos.sort((a,b) => b.bandwidth - a.bandwidth)[0].baseUrl, audio: audios.sort((a,b) => b.bandwidth - a.bandwidth)[0].baseUrl }; } // 使用示例 const urls = getBiliVideoUrl(); console.log('视频地址:', urls.video); console.log('音频地址:', urls.audio); ``` ### 五、扩展方法 对于需要持久化获取的场景,建议通过B开放API获取视频信息: ```javascript // 需自行申请API权限 fetch(`https://api.bilibili.com/x/player/playurl?cid=视频CID&bvid=视频BVID&qn=112`) .then(res => res.json()) .then(data => console.log(data.data.durl[0].url)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值