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;
}
遍历两次! 找到最大值 最小值!!