Leetcode8月29号打卡

139 阅读1分钟

1.leetcode127题 BFS

磨了好久啊!!! 我吐了!! 其实自己的思路一直都是对的,只不过一些细节上出了问题!

list里的contains() 和set里的contains()感觉还是不一样啊

2.输入是一个分数a/b,b>a>0 输出这个分数对应的小数形式 循环小数用括号把循环节括起来

1/4 = 0.25 1/3 = 0.(3) 1/6 = 0.1(6) 1/7 =0.(142857)

#include<stdio.h>
int main()
{
	//n为被除数,d为除数 
	int n,d,i,flag=0;
	//a为正数部分,b为余数,c为每一位小数,k记录循环节位置 
	int a,b[100],c[100],top,k;
	while((scanf("%d/%d",&n,&d))!=EOF)
	{
		top=flag=0;
		//获取正数部分、第一次余数,第一位小数 
		a=n/d;
		b[top]=n%d;
		c[top]=b[top]*10/d;
		//当余数不为0 
		while(b[top]!=0)
		{
			top++;
			//计算下一次余数,下一位小数 
			b[top]=b[top-1]*10%d;
			c[top]=b[top]*10/d;
			//如果余数出现和第一次的余数相等,说明出现循环节 
			for(i=0;i<top;i++)
				if(b[i]==b[top])
				{
					flag=1;
					k=i;
					break;
				}
			if(flag)
				break;
		}
		//输出格式化 
		printf("%d/%d=",n,d);
		if(a!=0)
			printf("%d",a);
		if(top!=0)
			printf(".");

		for(i=0;i<top;i++)
		{
			if(flag&&i==k)
				printf("(");
			printf("%d",c[i]);
			if(flag&&(i+1)==top)
				printf(")");
		}

		printf("\n");
	}	
}

3.leetcode915题 分割数组 很巧妙!

class Solution {
    public int partitionDisjoint(int[] A) {

        int l = 0,r = A.length - 1;
        while(l < r){
            int mid = l + r >> 1;
            if(check(A,mid)){
                r = mid;
            }else{
                l = mid + 1;
            }
        }

        return l;
    }
    public boolean check(int[] A ,int mid){
        int minV = Integer.MAX_VALUE;
        for(int i = mid ;i < A.length;i++){
            minV = Math.min(minV,A[i]);
        }

        for(int i = 0;i < mid;i++){
            if(A[i] > minV){
                return false;
            }
        }
        return true;
    }

}

不知道为啥过不了,还是有细节上的问题

    public int partitionDisjoint(int[] A) {
        int n = A.length;
        int[] maxLeft = new int[n];
        int[] minRight = new int[n];
        int maxL = A[0];
        for(int i = 0;i < n;i++){
            maxL = Math.max(maxL,A[i]);
            maxLeft[i] = maxL;
        }
        int minR = A[n - 1];
        for(int i = n - 1;i >= 0;i--){
            minR = Math.min(minR,A[i]);
            minRight[i] = minR;
        }

        for(int i = 1;i < n;i++){
            if(maxLeft[i - 1] <= minRight[i]){
                return i;
            }
        }
        return -1;
    }

遍历两次! 找到最大值 最小值!!