美团的破局之路(含笔试原题)

写在前面

中概惨,美团最近更是惨上加惨。

利润率个位数,财报爆雷,现在还被谣言击穿防线,造成单日 个点以上的跌幅。

alt

自从字节的现象级产品 抖音 做出流量后,往各个方向扩张的脚步就从未停下。

其中就包括对涵盖"线下消费"一条龙的 美团 的围剿。

最近网传: 抖音要收购阿里的饿了么

alt

该消息现在已被抖音官方辟谣,但这个消息能够流传开来,是有它的逻辑的。

除了是 字节跳动一贯的围剿风格

另一方面,是 阿里巴巴目前在收缩战线,最近不断出售前期投资项目的股期股权

因此,对于出售饿了么,资本持基本相信态度。

对于美团,目前没有太好的破局思路。

国内几乎所有互联网,流量虽大,但几乎没有什么核心护城河。

美团能做的东西,抖音也能做,但光靠那 20%-30% 的用户体验差别,是不足以让这"第一名"的头衔易主的。

消费者/用户的心智空间,通常只会记住第一名,只要不发生实际上的区别,第一名会永远的赢下去。

美团目前能做的,就是熬到字节跳动没有耐心,最终放弃围剿。

毕竟字节跳动的围剿也是有成本次数限制的。

无论是"对教培的围剿"(政策)、"对游戏的围剿"、或是"对 SHEIN 的围剿"目前都几乎接近尾声。

美团只能把希望放在,抖音会放弃对「线下业务」的围剿。

这是一个合理的期望,毕竟抖音的流量有更好的变现方式,单纯为了搞垮美团而无底线的违背经济原则是不可持续的。

剩者为王,美团只能重新和抖音,再走一次当时和点评走过的路。

闲话聊完了,回归主线,咱可是算法区博主,来一道美团笔试面试真题。

alt

题目描述

平台:LeetCode

题号:93

有效 IP 地址正好由四个整数(每个整数位于 0255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。

例如:"0.1.2.201""192.168.1.1" 是有效 IP 地址,

但是 "0.011.255.245""192.168.1.312""192.168@1.1" 是无效 IP 地址。

给定一个只包含数字的字符串 s ,用以表示一个 IP 地址。返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。

不能重新排序或删除 s 中的任何数字,可以按任何顺序返回答案。

示例 1:

输入:s = "25525511135"

输出:["255.255.11.135","255.255.111.35"]

示例 2:

输入:s = "0000"

输出:["0.0.0.0"]

提示:

  • s 仅由数字组成

回溯算法

一道求所有方案的题目,只能是没有太多优化的「爆搜」做法。

设计递归函数 void dfs(int idx, int n, List<Integer> cur),其中 idx 代表当前处理字符串 s 的哪个位置,n 代表字符串 s 总长度,而 cur 的则是代表子串 部分的具体划分方案。

用题目样例 s = "25525511135" 作为 🌰,n 固定为 11

idx = 3 时,cur cur 部分的划分方案可能是 [2,5,5][2,55][25,5][255] 之一。

cur 的基础上,我们继续爆搜剩余部分,即递归执行 dfs(idx, n, cur),算法会将剩余部分的划分方案添加到 cur 上,我们只需要确保每次追加到 cur 的数值符合要求即可(没有前导零 且 范围在 中)。

在单次回溯过程中,我们可以将 idx 作为当前划分数字的左端点,通过枚举的形式找到右端点 j,并将当前数字 加到 cur 中(若合法),回溯到底后再添加到 cur 的元素进行移除。

idx = n 代表整个 s 已经处理完成,若此时 cur 恰好有 个元素,说明我们找到了一组合法方案,将其拼接成字符串追加到答案数组中。

同时也是由于划分过程中 cur 最多只有 个元素,我们可以用此做简单剪枝。

Java 代码:

class Solution {
    List<String> ans = new ArrayList<>();
    char[] cs;
    public List<String> restoreIpAddresses(String s) {
        cs = s.toCharArray();
        dfs(0, cs.length, new ArrayList<>());
        return ans;
    }
    void dfs(int idx, int n, List<Integer> cur) {
        if (cur.size() > 4return ;
        if (idx == n) {
            if (cur.size() == 4) {
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < 4; i++) sb.append(cur.get(i)).append(".");
                ans.add(sb.substring(0, sb.length() - 1));
            }
        } else {
            for (int i = idx; i < n; i++) {
                int t = 0;
                for (int j = idx; j <= i; j++) t = t * 10 + (cs[j] - '0');
                if (cs[idx] == '0' && i != idx) break;
                if (t > 255break;
                cur.add(t);
                dfs(i + 1, n, cur);
                cur.remove(cur.size() - 1);
            }
        }
    }
}

C++ 代码:

class Solution {
public:
    vector<string> ans;
    string s;
    void dfs(int idx, int n, vector<int>& cur) {
        if (cur.size() > 4return ;
        if (idx == n) {
            if (cur.size() == 4) {
                string sb;
                for (int i = 0; i < 4; i++) sb += to_string(cur[i]) + ".";
                ans.push_back(sb.substr(0, sb.length() - 1));
            }
        } else {
            for (int i = idx; i < n; i++) {
                int t = 0;
                for (int j = idx; j <= i; j++) t = t * 10 + (s[j] - '0');
                if (s[idx] == '0' && i != idx) break;
                if (t > 255break;
                cur.push_back(t);
                dfs(i + 1, n, cur);
                cur.pop_back();
            }
        }
    }
    vector<stringrestoreIpAddresses(string _s) {
        s = _s;
        vector<int> cur;
        dfs(0, s.length(), cur);
        return ans;
    }
};

Python 代码:

class Solution:
    def restoreIpAddresses(self, s: str) -> List[str]:
        ans = []
        def dfs(idx, n, cur):
            if len(cur) > 4:
                return 
            if idx == n:
                if len(cur) == 4:
                    ans.append('.'.join(cur))
            else:
                for i in range(idx, n):
                    t = 0
                    for j in range(idx, i + 1):
                        t = t * 10 + (ord(s[j]) - ord('0'))
                    if s[idx] == '0' and i != idx:
                        break
                    if t > 255:
                        break
                    cur.append(str(t))
                    dfs(i + 1, n, cur)
                    cur.pop()
        dfs(0, len(s), [])
        return ans

TypeScript 代码:

function restoreIpAddresses(s: string): string[] {
    const ans = new Array<string>()
    function dfs(idx: number, n: number, cur: Array<number>): void {
        if (cur.length > 4return 
        if (idx == n) {
            if (cur.length == 4) {
                let str = ''
                for (let i = 0; i < 4; i++) str += cur[i] + "."
                ans.push(str.substring(0, str.length - 1))
            }
        } else {
            for (let i = idx; i < n; i++) {
                let t = 0
                for (let j = idx; j <= i; j++) t = t * 10 + (s.charCodeAt(j) - '0'.charCodeAt(0))
                if (s[idx] == '0' && i != idx) break
                if (t > 255break
                cur.push(t)
                dfs(i + 1, n, cur)
                cur.pop()
            }
        }
    }
    dfs(0, s.length, new Array<number>())
    return ans
}
  • 时间复杂度:爆搜不讨论时空复杂度
  • 空间复杂度:爆搜不讨论时空复杂度

更多更全更热门的「笔试/面试」相关资料可访问排版精美的 合集新基地 🎉🎉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/292153.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SVN使用总结

安装 使用 回撤与恢复功能 FAQ SVN服务器路径被改 IP地址改成ddqc-fs01 SVN右键选择relocate SVN文件无法比较

【MYSQL】-数据类型

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

[vue]Echart使用手册

[vue]Echart使用手册 使用环境Echart的使用Echart所有组件和图表类型Echart 使用方法 使用环境 之前是在JQuery阶段使用Echart&#xff0c;直接引入Echart的js文件即可&#xff0c;现在是在vue中使用,不仅仅时echarts包&#xff0c;还需要安装vue-echarts&#xff1a; "…

Linux调试器gdb的用法

Linux调试器gdb的用法 1. debug/release版本之间的比较2. gdb调试器的基本指令3. 使用展示 1. debug/release版本之间的比较 在之前学习C语言的的时候出过一期vs的调试技巧。 而对于现在的Linux下的调试器gdb其实也是换汤不换药的&#xff0c;基本上的调试思路是不会改变的&am…

安全、高效的MySQL DDL解决方案

MySQL作为目前应用最广泛的开源关系型数据库&#xff0c;是许多网站、应用和商业产品的主要数据存储。在生产环境&#xff0c;线上数据库常常面临着持续的、不断变化的表结构修改&#xff08;DDL&#xff09;&#xff0c;如增加、更改、删除字段和索引等等。其中一些DDL操作在M…

司铭宇老师《流量密码-全网全渠道营销拓客高手特训营》网络营销培训

《流量密码-全网全渠道营销拓客高手特训营》 在互联网的浪潮中&#xff0c;无论是大型企业还是小型创业公司&#xff0c;都面临着一个共同的问题&#xff1a;如何有效地吸引和留住客户&#xff1f;答案就是全网全渠道营销。这是一种全新的营销模式&#xff0c;它能够帮助企业在…

宕机后,Redis如何实现快速恢复?

Redis作为非常火热的内存数据库&#xff0c;其除了具有非常高的性能之外&#xff0c;还需要保证高可用&#xff0c;在故障发生时&#xff0c;尽可能地降低故障带来的影响&#xff0c;Redis也提供了完善的故障恢复机制&#xff1a;哨兵。 下面就来具体来看看Redis的故障恢复是如…

vue-pure-admin源码解读与使用

vue-pure-admin 全面使用ESMVue3ViteElement-PlusTypeScript编写的一款后台管理系统&#xff08;兼容移动端&#xff09;,目前斩获11.5k个star。 界面构成 主题Layout的组成 左边sidebar由Vertical组件定义tab标签栏由layoutHeader组件定义中间Body由appMain组件定义 为何点…

RouterSrv-路由功能

2023年全国网络系统管理赛项真题 模块B-Windows解析 题目 安装Remote Access服务开启路由转发,为当前实验环境提供路由功能。启用网络地址转换功能,实现内部客户端访问互联网资源。答题步骤 安装Remote Access服务开启路由转发,为当前实验环境提供路由功能。 配置网卡 加…

VSCode安装PYQT5

安装PYQT5 pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple pip install PyQt5-tools -i https://pypi.tuna.tsinghua.edu.cn/simple 获得Python环境位置 查看函数库安装位置 pip show 函数库名 通过查询函数库&#xff0c;了解到python安装位置为 C:\User…

数学建模笔记-拟合算法

内容&#xff1a;拟合算法 一.概念&#xff1a; 拟合的结果就是找到一个确定的曲线 二.最小二乘法&#xff1a; 1. 2.最小二乘法的二表示的是平方的那个2 3.求解最小二乘法&#xff1a; 三.评价拟合的好坏 1.总体评分和SST&#xff1a; 2.误差平方和SSE&#xff1a; 3.回…

数据分析基础之《numpy(6)—合并与分割》

了解即可&#xff0c;用panads 一、作用 实现数据的切分和合并&#xff0c;将数据进行切分合并处理 二、合并 1、numpy.hstack 水平拼接 # hstack 水平拼接 a np.array((1,2,3)) b np.array((2,3,4)) np.hstack((a, b))a np.array([[1], [2], [3]]) b np.array([[2], […