题目链接:https://leetcode-cn.com/problems/minimum-subsequence-in-non-increasing-order/
题目描述:
image.png
题目要点:
题目花里胡哨描述了一大堆,其实意思不就是从最大的数字挑选相加,待结果大于剩下的数值之和就返回么。
1、返回 长度最小 的子序列--->说明子序列成员是从大的数字里挑选
2、返回的答案应当按 非递增顺序 排列--->说明返回数组倒序
3、「数组的子序列」不强调元素在原数组中的连续性--->说明可以排序打乱原来的数组随意挑选
代码如下:
vector<int> minSubsequence(vector<int>& nums) {
int i,j;
int total=0;
int result = 0;
int n = nums.size();
vector<int> return_result;
sort(nums.begin(), nums.end());
for (i = 0;i < n;i++)
total += nums[i];
for (i = n-1;i > 0;i--) {
result += nums[i];
if (result > total - result)
break;
}
for (j=n-1;j >= i;j--)
return_result.push_back(nums[j]);
return return_result;
}
第二题:将二进制表示减到 1 的步骤数
题目链接:https://leetcode-cn.com/problems/number-of-steps-to-reduce-a-number-in-binary-representation-to-one/
题目描述:

将二进制表示减到 1 的步骤数
题目要点:
1、1 <= s.length <= 500
这意味着,无法暴力将二进制转换成十进制数计算,因为2^500超过了所有类型的上限,如果自己写个大整数也可以,但杀鸡用宰牛刀太傻了。
2、既然无法使用十进制计算,那就模拟二进制计算,根据二进制除法规则,所谓的除2其实就是移位,比如1110(14)除2结果为111(7),数据右移了移位。如果把二进制数当做字符串遍历,每一次循环就会自动移位一次,也就是除以2。
3、所以,只需要额外处理奇数+1的进位问题并记录下步骤数即可。
4、进位溢出了原本的长度,说明其结果还要额外右移一次。
代码如下:
int numSteps(string s) {
int i,j;
int n = s.length();
int step = 0;
for (i = n - 1;i > 0;i--) {
if (s[i] == '1') {//说明是奇数,奇数将+1进位,这里使得s[i]='0'会显得逻辑清晰,但是对于程序来说并不需要
s[i] = '0';
step++;
if (s[i - 1] == '0') s[i - 1] = '1';
else {
j = i - 1;
if (j >= 0)
{
while (j>=0) {
if (s[j] == '1') {
s[j] = '0';
j--;
}
else {
s[j] = '1';
break;
}
}
}
}
}
step++;
}
if(s[0]=='0') step++;
return step;
}
关于进位的判断应该可以再简化。

我怀疑网站的提交判定出了问题