连续子数组的最大和
输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n).
示例1
输入:[1,-2,3,10,-4,7,2,-5]
返回值:18
说明:输入的数组为{1,-2,3,10,—4,7,2,一5},和最大的子数组为{3,10,一4,7,2},因此输出为该子数组的和 18。
public class Solution { public int FindGreatestSumOfSubArray(int[] array) { int max=array[0]; int res=array[0]; for(int i=1;i<array.length;i++) { max=Math.max(max+array[i],array[i]); res=Math.max(max,res); } return res; } }
1-n整数中1出现的次数
求出1-13的整数中1出现的次数,并算出100-1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。
示例1
输入:13
返回值:6
public class Solution { public int NumberOf1Between1AndN_Solution(int n) { StringBuffer s=new StringBuffer(); for(int i=1;i<=n;i++) { s.append(i); } String str=s.toString(); int c=0; for(int i=0;i<str.length();i++) { if(str.charAt(i)=='1') { c++; } } return c; } }
把数组排成最小的数
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
示例1
输入:[3,32,321]
返回值:"321323"
import java.util.ArrayList; public class Solution { public String PrintMinNumber(int [] numbers) { String s=""; for(int i=0;i<numbers.length;i++) { for(int j=i+1;j<numbers.length;j++) { int a=Integer.valueOf(numbers[i]+""+numbers[j]); int b=Integer.valueOf(numbers[j]+""+numbers[i]); if(b<a) { int t; t=numbers[i]; numbers[i]=numbers[j]; numbers[j]=t; } } } for(int i=0;i<numbers.length;i++) { s+=numbers[i]; } return s; } }
丑数
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
示例1
输入:7
返回值:8
import java.util.ArrayList; public class Solution { public int GetUglyNumber_Solution(int index) { if(index==0) return 0; ArrayList<Integer> a=new ArrayList<>(); a.add(1); int i2=0,i3=0,i5=0; while(a.size()<index) { int n2=2*a.get(i2); int n3=3*a.get(i3); int n5=5*a.get(i5); int min=Math.min(Math.min(n2,n3),n5); if(min==n2) i2++; if(min==n3) i3++; if(min==n5) i5++; a.add(min); } return a.get(index-1); } }
两个链表的第一个公共节点
输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ //辅助栈 import java.util.Stack; public class Solution { public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { if(pHead2==null||pHead1==null) return null; Stack<ListNode> s1=new Stack<>(); Stack<ListNode> s2=new Stack<>(); while(pHead1!=null) { s1.add(pHead1); pHead1=pHead1.next; } while(pHead2!=null) { s2.add(pHead2); pHead2=pHead2.next; } ListNode l=null; while(!s1.isEmpty()&&!s2.isEmpty()&&s1.peek()==s2.peek()) { l=s1.pop(); s2.pop(); } return l; } } //长度遍历 public class Solution { public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { if(pHead2==null||pHead1==null) return null; ListNode p1=pHead1; ListNode p2=pHead2; while(p2!=p1) { p2=p2.next; p1=p1.next; if(p1!=p2) { if(p1==null) p1=pHead2; if(p2==null) p2=pHead1; } } return p2; } }