美团笔试0819第三题

样例:10001 输出8

java选手帮忙看看为啥0%啊,我这已经纯暴力了,列举了所有的连续子串,各自计算子串的权值再相加。

import java.util.HashMap;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static HashMap<String, Integer> map = new HashMap<>();

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        int n = str.length();
        long ans = getAns(str);
        System.out.println(ans);
    }

    private static long getAns(String input) {
        long sum = 0;
        int n = input.length();
        for (int i = 0; i < n; i++) {
            for (int j = i; j < n; j++) {
				//获取连续子串
                String s = input.substring(i, j + 1);
			 	//获取子串的权值:最小修改次数,使得字符串01交替出现
                int count = getCount(s);
                sum += count;
            }
        }
        return sum;
    }

    private static int getCount(String str) {
        if (map.containsKey(str)) {
            return map.get(str);
        }
        int flips = 0;
        int n = str.length();
        int ans1 = 0, ans2 = 0;
        int pre = str.charAt(0);
	  	//暴力法
	  	//前后两个一样时,讨论修改“后面的”和修改“前面的”两种情况
        for (int i = 1; i < n; i++) {
            char cur = str.charAt(i);
            if (pre == cur) {
                ans1++;
                cur = cur == '0' ? '1' : '0';
                pre = cur;
            } else {
                pre = cur;
            }
        }
        pre = str.charAt(0);
        for (int i = 1; i < n; i++) {
            char cur = str.charAt(i);
            if (pre == cur) {
                ans2++;
                pre = pre == '0' ? '1' : '0';
                pre = cur;
            } else {
                pre = cur;
            }
        }
        flips = Math.min(ans1, ans2);
        map.put(str, flips);
        return flips;
    }
}

全部评论
你这暴力还没穷举完全,getCount里面只搜了两种情况,纯暴力应该是对每一个字符按照取反和不取反dfs。当然对dfs穷举优化的话就是dp,也就是你的ans1和ans2要一起算
1 回复 分享
发布于 2023-08-20 13:05 广东
同学,阿里控股集团JAVA开发岗投吗?我们和其他业务集团独立招聘,可以多次机会。需要的话,可以联系我。
点赞 回复 分享
发布于 2023-08-21 20:41 浙江
我想的是滑窗: int main() { int n; cin>> n ; int count_odd = 0 ; // 奇数位1 int count_even = 0 ; // 偶数位1 vector<char> source(n,'.'); //map<int> record; int record = 0 ; for(int i =0;i<n>>source[i]; } // get all substring for(int i = 0 ;i<source.size>count_odd)?count_odd:count_even; } } cout << record <</source.size></n></int></char>
点赞 回复 分享
发布于 2023-08-20 17:16 广东
暴力,超时了,86%
点赞 回复 分享
发布于 2023-08-19 21:39 湖南
我的思路是分两种情况,第一个字符是0,第一个字符是1。然后暴力得到两个值取最小的。但是会超时,只过了66
点赞 回复 分享
发布于 2023-08-19 21:34 陕西
暴力会超时
点赞 回复 分享
发布于 2023-08-19 21:33 天津
我和思路你一样,案例能过,一提交百分之0
点赞 回复 分享
发布于 2023-08-19 21:30 广东

相关推荐

mama3925:灵神是天才,路线不适合正常人
点赞 评论 收藏
分享
评论
2
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务