刚刚做完的爱奇艺编程题,有没有大佬会做的??求教学~

//小C有一张票,这张票的ID是长度为6的字符串,每个字符都是数字,他想让这个ID变成他的辛运ID,所以他就开始更改ID,每一次操作,他可以选择任意一个数字并且替换它。

//如果这个ID的前三位数字之和等于后三位数字之和,那么这个ID就是辛运的。你帮小C求一下,最少需要操作几次,能使ID变成辛运ID

输入/

输入只有一行,是一个长度为6的字符串。

输出

输出这个最小操作次数

样例输入

000000

样例输出

0

Hint

输入样例2

000018

输出样例2

1

---------------------------------------------------------------------------无情分割线-----------------------------------------

我的代码,只有18%的正确率,嘤嘤嘤。。。
package aiqiyi;

import java.util.Scanner;

public class Main {

public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int str = scan.nextInt();
int [] numarr = new int[6];
for(int i = 0; i < 6; i++){
numarr[i] = str%10;
str /= 10;
}
getDoNum(numarr);
}

public static void getDoNum(int [] numarr){
int sum;
if(numarr[0]+numarr[1]+numarr[2] == numarr[3]+numarr[4]+numarr[5]){
System.out.println(0);
}
else{
sum = doCount(numarr);
System.out.println(sum);
}

}

public static int doCount(int [] numarr){
int sum = 0;
int left = numarr[0]+numarr[1]+numarr[2];
int right = numarr[3]+numarr[4]+numarr[5];
int lack = left - right;
if(lack > 0){
if((9 - numarr[0] > Math.abs(lack)) || (9 - numarr[1] > Math.abs(lack)) || (9 - numarr[2] > Math.abs(lack))){
return 1;
}
}
return sum;
}

}




#爱奇艺##笔试题目#
全部评论
以919005为例 先对前3和后3分别排序(有序)——699005(991500也行) 然后求出双方之和的差gap(19-5=14) 然后开始凑,一次操作为较大方减一个值或者较小方加一个值 首先gap为0的直接输出0结束了 然后gap不为0的话,负数则左小右大,正数左大右小 然后开始双指针缩小gap,这里是14,先判断左边可减少的最大值(9→0)和右边可增加的最大值(0→9)谁比较大(一样大),较大方和gap比较 如果某个值大于gap的绝对值那么输出当前操作数+1返回 一样大的话随便操作一个,比如9→0,然后左指针指向下一个数,右指针不变,gap-9(5),操作数+1 下一步继续循环 题目只有6位是真的暴力拆解就可以了 我的方法适合任意位数
点赞 回复 分享
发布于 2018-09-15 12:29
我是用两边的差÷9然后如果有余数再加1,就是结果
点赞 回复 分享
发布于 2018-09-15 12:12
才6个位置,暴力求解也就,6*5*10*10+6*10,才3060次,没必要用优化的算法,直接穷举,因为该3个位置一定能让它是幸运数字,所以只用考虑该一个位置和两个位置的情况。
点赞 回复 分享
发布于 2018-09-15 12:20
贪心法 给每个数组排序left[] right[] 较小的从头开始遍历i++大的从尾部开始遍历j-- 每次取9-left[i]和right[j]较大者 大于或等于二者差距终止 否则二者差减去较大值 继续迭代
点赞 回复 分享
发布于 2018-09-15 12:28
直接暴力91%
点赞 回复 分享
发布于 2018-09-15 12:43
楼主不会以为这是送分题吧,写这么简单 我的思路是这样的:假如输入是abcxyz 记 m=a+b+c,n=x+y+z 1.最多改三个数字(m!=n),最少0个(m=n) 2.如果m!=n,就要把a,b,c和x,y,z这两组数分别排序: 如果m>n,就要把a,b,c中最大的数 s 改小为0或者把x,y,z中最小的数 t 改大为9,具体看s和9-t的大小,如果m-n<=Max(s,9-t),那么恭喜改完这次就结束了,否则,还得重新计算m和n,重复上面步骤(注意:改过的数不能再参与后续过程);m<n也是一样
点赞 回复 分享
发布于 2018-09-17 11:50
https://www.nowcoder.com/discuss/109852
点赞 回复 分享
发布于 2018-09-15 12:14
我靠你这思路有点扯啊
点赞 回复 分享
发布于 2018-09-15 12:15
0.7 不清楚为啥不A
点赞 回复 分享
发布于 2018-09-15 12:22
老哥,直接输出2就能a0.64🌚
点赞 回复 分享
发布于 2018-09-15 12:26
我是直接把前三位的数字相加 后三位的数字相加  然后这两个数相减 因为要修改数字的话 每一位最多能改成9 这样的话 两个数的差如果是小于9的话 那么修改一位就可以了 如果是在10 -18 之间就修改两位 如果在19-27之间就修改三位 差为0的话就不需要修改了
点赞 回复 分享
发布于 2018-09-15 12:43
前三个和后三个的差值,最小三个数顺序排列,差值-最小数的增长区间的值和0判断
点赞 回复 分享
发布于 2018-09-15 13:28
思路应该没差哈
点赞 回复 分享
发布于 2018-09-15 13:29
没有参加,刚写了一段供大家参考 s=list(map(int,input().split())) a=s[:3] b=s[3:] big=b if sum(b)>sum(a) else a small=a if sum(b)>sum(a) else b x=sum(big)-sum(small)      temp=big temp.sort(reverse=1) ans=0 if x==0:     pass else:     for i in range(3):         ans+=1         if sum(temp[:i])>=x:             break print(ans)
点赞 回复 分享
发布于 2018-09-15 13:56
   这道题有没有用python写的通过的大神呀,求代码呀
点赞 回复 分享
发布于 2018-09-15 16:19
#include <iostream> #include <algorithm> #include <string> #include <vector> #include <numeric> using namespace std; int getMin(vector v) { int minVal = INT_MAX; for (auto e : v) minVal = min(e, minVal); return minVal; } int calc(vector v1, vector v2) { int sum1 = accumulate(v1.begin(), v1.end(), 0); int sum2 = accumulate(v2.begin(), v2.end(), 0); if (sum1 > sum2) { swap(v1, v2); swap(sum1, sum2); } int diff = sum2 - sum1; int ret = 0; if (diff == 0) return ret; else { while (diff > 0) { int tmp = 9 - getMin(v1); auto it = find(v1.begin(), v1.end(), getMin(v1)); *it = 9; diff -= tmp; ++ret; } } return ret; } int main(int argc, char const *argv[]) { string str; cin >> str; vector v; for (auto s : str) v.emplace_back(s - '0'); vector v1(v.begin(), v.begin() + 3); vector v2(v.begin() + 3, v.end()); int res = calc(v1, v2); cout << res << endl; return 0; }
点赞 回复 分享
发布于 2018-09-15 16:24

相关推荐

我已成为0offer的糕手:别惯着,胆子都是练出来的,这里认怂了,那以后被裁应届被拖工资还敢抗争?
点赞 评论 收藏
分享
点赞 7 评论
分享
牛客网
牛客企业服务