华为机试在线训练–牛客网(python)第二部分

本文介绍了华为机试在线训练–牛客网的Python编程第二部分,涵盖11~20题,包括数字颠倒、字符串反转、句子逆序等题目,涉及字符串操作、逻辑处理和算法应用。

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

华为机试在线训练–牛客网(python)

第二部分(11~20)

第十一题:数字颠倒

题目描述
描述:
输入一个整数,将这个整数以字符串的形式逆序输出
程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001
输入描述:
输入一个int整数
输出描述:
将这个整数以字符串的形式逆序输出
示例1
输入
1516000
输出
0006151

#coding=utf-8
arr=[]
num = raw_input()
for i in range(len(num)):
    arr.append(num[len(num)-1-i])
print ''.join(arr)

第十二题:字符串反转

题目描述
写出一个程序,接受一个字符串,然后输出该字符串反转后的字符串。例如:
输入描述:
输入N个字符
输出描述:
输出该字符串反转后的字符串
示例1
输入
abcd
输出
dcba

#coding=utf-8
arr=[]
num = raw_input()
for i in range(len(num)):
    arr.append(num[len(num)-1-i])
print ''.join(arr)

第十三题:句子逆序

题目描述
将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I”
所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符
接口说明
/**
* 反转句子
*
* @param sentence 原句子
* @return 反转后的句子
*/
public String reverse(String sentence);
输入描述:
将一个英文语句以单词为单位逆序排放。
输出描述:
得到逆序的句子
示例1
输入
I am a boy
输出
boy a am I

arr=[]
str = raw_input()
ss = str.split(' ')
a = len(ss)
for i in range(a):
    arr.append(ss[a-1-i])
print ' '.join(arr)

第十四题:字串的连接最长路径查找

题目描述
给定n个字符串,请对n个字符串按照字典序排列。
输入描述:
输入第一行为一个正整数n(1≤n≤1000),下面n行为n个字符串(字符串长度≤100),字符串中只含有大小写字母。
输出描述:
数据输出n行,输出结果为按照字典序排列的字符串。
示例1
输入
9
cap
to
cat
card
two
too
up
boat
boot
输出
boat
boot
cap
card
cat
to
too
two
up

str =[]
num = input()
for i in range(num):
    a=raw_input()
    str.append(a)
for j in sorted(str):
    print j

第十五题:求int型正整数在内存中存储时1的个数

题目描述
输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数。
输入描述:
输入一个整数(int类型)
输出描述:
这个数转换成2进制后,输出1的个数
示例1
输入
5
输出
2

num = int(raw_input())
one_num = 0
if num == 0:
    print 0
else:
    while num > 0:
        one_num += num % 2
        num = num / 2
print one_num

第十六题:购物单

题目描述
王强今天很开心,公司发给N元的年终奖。王强决定把年终奖用于购物,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:

主件 附件
电脑 打印机,扫描仪
书柜 图书
书桌 台灯,文具
工作椅

如果要买归类为附件的物品,必须先买该附件所属的主件。每个主件可以有 0 个、 1 个或 2 个附件。附件不再有从属于自己的附件。王强想买的东西很多,为了不超出预算,他把每件物品规定了一个重要度,分为 5 等:用整数 1 ~ 5 表示,第 5 等最重要。他还从因特网上查到了每件物品的价格(都是 10 元的整数倍)。他希望在不超过 N 元(可以等于 N 元)的前提下,使每件物品的价格与重要度的乘积的总和最大。
设第 j 件物品的价格为 v[j] ,重要度为 w[j] ,共选中了 k 件物品,编号依次为 j 1 , j 2 ,……, j k ,则所求的总和为:
v[j 1 ]w[j 1 ]+v[j 2 ]*w[j 2 ]+ … +v[j k ]*w[j k ] 。(其中 为乘号)
请你帮助王强设计一个满足要求的购物单。
输入描述:
输入的第 1 行,为两个正整数,用一个空格隔开:N m
(其中 N ( <32000 )表示总钱数, m ( <60 )为希望购买物品的个数。)
从第 2 行到第 m+1 行,第 j 行给出了编号为 j-1 的物品的基本数据,每行有 3 个非负整数 v p q
(其中 v 表示该物品的价格( v<10000 ), p 表示该物品的重要度( 1 ~ 5 ), q 表示该物品是主件还是附件。如果 q=0 ,表示该物品为主件,如果 q>0 ,表示该物品为附件, q 是所属主件的编号)
输出描述:
输出文件只有一个正整数,为不超过总钱数的物品的价格与重要度乘积的总和的最大值( <200000 )。
示例1
输入
1000 5
800 2 0
400 5 1
300 5 1
400 3 0
500 2 0
输出
2200

str=raw_input().split(" ")
N=int (str[0])
m=int (str[1<
<think>好的,用户现在想了解牛客网华为的第40题。首先,我需要回忆华为的常见题型结构。华为通常包含编程题,涉及数据结构、算法、字符串处理、动态规划等。牛客网上的题目可能有定的难度,尤其是后面的题目,比如第40题,可能属于较难的部分。 用户之前询问过C++的编译时多态,可能对编程有定基础,现在转向具体算法题的求解。我需要先确定第40题的具体内容,但可能用户没有提供题目细节,所以需要推测或查找相关信息。不过,由于无法直接访问外部资源,我需要依靠已有的知识库或者常见的华为题型进行推测。 常见的华为题可能包括字符串操作、图算法、树结构、动态规划等。比如,第40题可能是类似“合唱队形”、“购物单”、“迷宫问题”这样的题目。假设用户无法提供具体题目内容,我需要给出一个通用的解题思路,或者举一个典型的例子来说明如何应对这类问题。 另外,用户可能希望得到详细的解题步骤,包括问题分析、解题思路、代码实现注意事项。因此,我需要结构清晰地分步骤讲解,确保用户能够理解并应用到实际问题中。 考虑到用户可能需要具体的例子,假设第40题是一个典型的动态规划问题,比如“最长递增子序列”或其变种,或者是字符串处理问题。比如,可能的题目是计算字符串的最长回文子串,或者是图的最短路径问题。 在不确定具体题目内容的情况下,我可以选择一个常见的华为题作为例子,例如“合唱队形”问题,这通常涉及动态规划,且是华为中的经典题目。这个问题的描述是:N位同学站成排,要求其中的某些同学出列,使得剩下的同学排成合唱队形,即先递增再递减。求最少需要几位同学出列。 接下来,我需要详细分析这个问题,给出解题思路、动态规划的应用,以及代码实现的示例。同时,需要注意边界条件优化点,帮助用户理解如何应对类似的问题。 在回答过程中,需要使用中文,结构清晰,分步骤讲解,并确保代码的正确性可读性。同时,要提醒用户注意测用例的覆盖可能的陷阱,比如重复元素、极端情况等。 总结来说,我需要: 1. 假设一个可能的华为第40题,例如“合唱队形”问题。 2. 分步骤解析问题,包括问题描述、输入输出、解题思路。 3. 使用动态规划的方法详细讲解如何求解最长递增子序列及其变种。 4. 提供代码示例,并解释关键部分。 5. 总结注意事项优化建议。 这样可以帮助用户即使面对不同的具体题目,也能掌握解题的方法思路,提升解决类似问题的能力。</think>--- ### **牛客网华为第40题详解** 由于华为题库会定期更新,且题目编号可能因版本不同有所变化,以下内容基于典型的**华为高频题型**进行分析。假设第40题涉及**动态规划**或**字符串处理**,我们以道经典题目**“合唱队形问题”**为例进行详细解析,其解题思路与代码实现具有广泛适用性。 --- #### **、题目描述** **问题**: N位同学站成排,音乐老师要请其中的$(N-K)$位同学出列,使得剩下的$K$位同学排成**合唱队形**。合唱队形要求: - 队形为**先严格递增再严格递减** - 不允许仅递增或仅递减 求最少需要多少同学出列,即求最大的$K$值。 **输入示例**: ``` 8 186 186 150 200 160 130 197 200 ``` **输出示例**: ``` 4 ``` **解释**: 最终队列为 `150 160 130` 或 `160 130 197` 等,需要移除4人。 --- #### **二、解题思路** **核心思想**: 1. **双向动态规划** - 对每个位置,计算其**左侧最长递增子序列长度**(LIS) - 计算其**右侧最长递减子序列长度**(LDS) - 两者相加再减1(当前元素被重复计算次),即为以该元素为中心的合唱队形最大长度 2. **状态转移方程** - 递增序列:$dp\_inc[i] = \max(dp\_inc[j] + 1) \quad (0 \leq j < i \text{且} arr[j] < arr[i])$ - 递减序列:$dp\_dec[i] = \max(dp\_dec[j] + 1) \quad (i < j < n \text{且} arr[j] < arr[i])$ **步骤分解**: 1. 计算每个位置的左侧最长递增子序列 2. 计算每个位置的右侧最长递减子序列 3. 遍历所有位置,找到最大$(dp\_inc[i] + dp\_dec[i] - 1)$ 4. 最终结果为$n - \max\_len$ --- #### **三、代码实现** ```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int n; cin >> n; vector<int> heights(n); for (int i = 0; i < n; ++i) { cin >> heights[i]; } vector<int> dp_inc(n, 1); // 左侧递增序列长度 for (int i = 1; i < n; ++i) { for (int j = 0; j < i; ++j) { if (heights[j] < heights[i]) { dp_inc[i] = max(dp_inc[i], dp_inc[j] + 1); } } } vector<int> dp_dec(n, 1); // 右侧递减序列长度 for (int i = n-2; i >= 0; --i) { for (int j = n-1; j > i; --j) { if (heights[j] < heights[i]) { dp_dec[i] = max(dp_dec[i], dp_dec[j] + 1); } } } int max_len = 0; for (int i = 0; i < n; ++i) { max_len = max(max_len, dp_inc[i] + dp_dec[i] - 1); } cout << n - max_len << endl; return 0; } ``` --- #### **四、关键点解析** 1. **时间复杂度**: - 双重循环导致时间复杂度为$O(n^2)$ - 可通过贪心+二分优化至$O(n \log n)$(适用于大规模数据) 2. **边界条件**: - 所有身高相同时,输出$n-1$(只能保留1人) - 严格递增或严格递减时,需保证至少有一个峰顶 3. **华为常见陷阱**: - 输入数据可能存在多个相同值,需注意严格递增/递减的判断 - 测用例可能包含极端情况(如n=0或n=1) --- #### **五、优化思路(高阶)** 1. **贪心+二分优化** 将LIS/LDS的计算优化为$O(n \log n)$: ```cpp // 以递增序列为例 vector<int> tails; for (auto num : heights) { auto it = lower_bound(tails.begin(), tails.end(), num); if (it == tails.end()) { tails.push_back(num); } else { *it = num; } dp_inc[i] = tails.size(); } ``` 2. **空间压缩** 使用滚动数组减少空间占用 --- #### **六、相似题型拓展** 1. **最长递增子序列**(LeetCode 300) 2. **山脉数组**(LeetCode 845) 3. **俄罗斯套娃信封问题**(LeetCode 354) --- **总结**:华为中类似题目考察动态规划的核心应用能力,解题关键在于将问题分解为已知模型(如LIS)。掌握双向DP的思路后,可灵活应用于多种变种题型。实际考中需注意代码鲁棒性边界条件处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值