【LeetCode】824. 山羊拉丁文、812. 最大三角形面积、821. 字符的最短距离

824. 山羊拉丁文
给定一个由空格分割单词的句子 S。每个单词只包含大写或小写字母。
我们要将句子转换为 “Goat Latin”(一种类似于 猪拉丁文 - Pig Latin 的虚构语言)。

山羊拉丁文的规则如下:
如果单词以元音开头(a, e, i, o, u),在单词后添加"ma"。
例如,单词"apple"变为"applema"。
如果单词以辅音字母开头(即非元音字母),移除第一个字符并将它放到末尾,之后再添加"ma"。
例如,单词"goat"变为"oatgma"。
根据单词在句子中的索引,在单词最后添加与索引相同数量的字母'a',索引从1开始。
例如,在第一个单词后添加"a",在第二个单词后添加"aa",以此类推。
返回将 S 转换为山羊拉丁文后的句子。

示例 1:
输入: "I speak Goat Latin"
输出: "Imaa peaksmaaa oatGmaaaa atinLmaaaaa"
示例 2:
输入: "The quick brown fox jumped over the lazy dog"
输出: "heTmaa uickqmaaa rownbmaaaa oxfmaaaaa umpedjmaaaaaa overmaaaaaaa hetmaaaaaaaa azylmaaaaaaaaa ogdmaaaaaaaaaa"
说明:

S 中仅包含大小写字母和空格。单词间有且仅有一个空格。
1 <= S.length <= 150。

分析:
将字符串S以空格分割,分割后的字符串存入数组ArrayS中(初始化为"",for循环边初始化边存入), res用来返回最后的字符串,初始为 "",遍历数组ArrayS,每遍历一个单词,判断单词是否以元音开头,不是(即辅音)则将首字母删掉加到最后,temp存此次末尾加的"a"(初始为"a",随着索引加一,temp也多加一个"a"),然后给这个单词后加上"ma"和temp,修改完毕,将单词和空格加到res后面,最后一个单词不加空格,返回res。

代码:

public class Test_0225 {
	public static void main(String[] args) {
		Solution So = new Solution();
		String S = "I speak Goat Latin";
		System.out.println(So.toGoatLatin(S));
	}
}
class Solution {
    public String toGoatLatin(String S) {
    	//数组ArrayS存S以空格分割后的单词
        String[] ArrayS =  new String[S.length()];
        int index_ArrayS=0;//ArrayS索引,最大时为单词个数
        ArrayS[0] = "";
        String res = "";
        for(int i=0; i<S.length(); i++){
        	if(S.charAt(i) != ' ')
        		ArrayS[index_ArrayS] = ArrayS[index_ArrayS] + String.valueOf(S.charAt(i));
        	else{
        		index_ArrayS++;
        		ArrayS[index_ArrayS] = "";
        	}
        }
        String temp = "a";
        for(int j=0; j<=index_ArrayS; j++){
        	//首字母是辅音时将首字母删掉加到最后
        	if(ArrayS[j].charAt(0)!='a' && ArrayS[j].charAt(0)!='e' && ArrayS[j].charAt(0)!='i' &&
        		ArrayS[j].charAt(0)!='o' && ArrayS[j].charAt(0)!='u' && ArrayS[j].charAt(0)!='A'&& 
        		ArrayS[j].charAt(0)!='E' && ArrayS[j].charAt(0)!='I' && ArrayS[j].charAt(0)!='O' && 
        		ArrayS[j].charAt(0)!='U')
        		ArrayS[j] = ArrayS[j].substring(1) + String.valueOf(ArrayS[j].charAt(0));        	
        	ArrayS[j] = ArrayS[j] + "ma" + temp;
        	temp += "a"; 
        	if(j != index_ArrayS)
        		res = res + ArrayS[j] +" ";
        	else
        		res = res + ArrayS[j];        	
        }
        return res;
    }
}

812. 最大三角形面积
给定包含多个点的集合,从其中取三个点组成三角形,返回能组成的最大三角形的面积。
示例:
输入: points = [[0,0],[0,1],[1,0],[0,2],[2,0]]
输出: 2
解释: 
这五个点如下图所示。组成的橙色三角形是最大的,面积为2。

分析:
知道三点的坐标,求三角形面积的公式:  0.5*(x1-x0)*(y2-y0)-(x2-x0)*(y1-y0)
遍历所有点,计算符合条件的三角形的最大面积。

代码:

public class Test_0220 {
	public static void main(String[] args) {
		Solution So = new Solution();
		int[][] points = {{0,0},{0,1},{1,0},{0,2},{2,0}};
		System.out.println(So.largestTriangleArea(points));
	}
}
class Solution {
    public double largestTriangleArea(int[][] points) {
    	double area = 0.0;
        for(int i=0; i<points.length; i++){
        	for(int j=0; j!=i && j<points.length; j++){
        		for(int k=0; k!=i && k!=j &&k<points.length; k++){
        			area = Math.max(area, 0.5*Math.abs((points[j][0]-points[i][0])*(points[k][1]-points[i][1])-
                			(points[k][0]-points[i][0])*(points[j][1]-points[i][1])));
        		}
        	}
        }
        return area;
    }
}

821. 字符的最短距离
 给定一个字符串 S 和一个字符 C。返回一个代表字符串 S 中每个字符到字符串 S 中的字符 C 的最短距离的数组。

示例 1:
输入: S = "loveleetcode", C = 'e'
输出: [3, 2, 1, 0, 1, 0, 0, 1, 2, 2, 1, 0]
说明:
字符串 S 的长度范围为 [1, 10000]。
C 是一个单字符,且保证是字符串 S 里的字符。
S 和 C 中的所有字母均为小写字母。

分析:
遍历一遍S,找出字符C在S中的索引,将索引存入数组Cindex中,再次遍历字符串S,将每一个字符索引与Cindex中索引的最小差绝对值存入数组res中,返回res。

代码:

public class Test_0223 {
	public static void main(String[] args) {
		Solution So = new Solution();
		String S = "loveleetcode";
		char C = 'e';
		int[] res = So.shortestToChar(S, C);
		for(int i=0; i<res.length; i++){
			System.out.print(res[i]+" ");
		}
	}
}
class Solution {
    public int[] shortestToChar(String S, char C) {
        int[] Cindex = new int [S.length()];
        int[] res = new int [S.length()];
        int index = 0;
        for(int i=0; i<S.length(); i++){
        	if(S.charAt(i)==C){
        		Cindex[index] = i;
        		index++;
        	}
        }
        for(int i=0; i<S.length(); i++){
        	int min = 2147483647;
        	for(int j=0;j<index;j++){
        		min = Math.min(Math.abs(Cindex[j] - i), min);
        	}
        	res[i] = min;
        }
        return res;
    }
}