在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。
public class Solution {
//Parameters:
// numbers: an array of integers
// length: the length of array numbers
// duplication:(Output) the duplicated number in the array number,length of duplication arrayis 1,so using duplication[0] = ? in implementation;
// Hereduplication like pointor in C/C++, duplication[0] equal *duplication in C/C++
// 这里要特别注意~返回任意重复的一个,赋值duplication[0]
// Returnvalue: true if the input is valid, andthere are some duplications in the array number
// otherwise false
boolean duplicate(int numbers[],int length,int [] duplication) {
if(length<0) return false;
int[]a = new int[length];
for(int i=0;i a[numbers[i]]++; } for(int i=0; i if(a[i]>1){ duplication[0]=i; return true; } } return false; } } 请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。 public class Solution { //Insertone char from stringstream Stringstr = ""; int[] a= new int[256]; void Insert(char ch) { str+=ch; a[(int)ch]++; } //return the firstappearence once char in current stringstream char FirstAppearingOnce() { for(int i=0;i if(a[(int)str.charAt(i)]==1){ return str.charAt(i); } } return '#'; } } 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配 import java.util.regex.Pattern; import java.util.regex.Matcher; public class Solution { boolean match(char[]str, char[] pattern) { Strings = new String(str); Stringpa = new String(pattern); Patternp = Pattern.compile(pa); Matcherm = p.matcher(s); return m.matches(); } } 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。 import java.util.ArrayList; public class Solution { int[] multiply(int[]A) { int length = A.length; int[]B = new int[length]; if(A== null || length <= 0) return null; B[0]= 1; for(int i= 1;i B[i]= B[i-1] * A[i-1]; } int temp = 1; for(int i = length- 2;i>= 0;i --){ temp*= A[i+1]; B[i]*= temp; } return B; } } 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 //num1,num2分别为长度为1的数组。传出参数 //将num1[0],num2[0]设置为返回结果 import java.util.*; public class Solution { public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) { if(array.length<=1) return; ArrayList for(int i=0;i if(l.contains(array[i])){ l.remove(l.indexOf(array[i])); } else{ l.add(array[i]); } } num1[0]=l.get(0); num2[0]=l.get(1); } } 统计一个数字在排序数组中出现的次数。 public class Solution { public int GetNumberOfK(int [] array , int k) { int count = 0; for(int i=0;i if(k==array[i])count++; } return count; } } 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 public class Solution { public int InversePairs(int [] array) { if(array.length<2) return 0; int count = 0; for(int i=0;i for(int j=i+1;j if(array[i]>array[j])count++; } } return count; } } 在一个字符串(1<=字符串长度<=10000)中找到第一个只出现一次的字符。 返回: 1.字符在字符串的位置 2.当字符串长度为0时,返回-1 import java.util.*; public class Solution { public int FirstNotRepeatingChar(Stringstr) { Map if(str.length()==0) return -1; //第一次扫描 for(int i=0;i { //得到出现次数 Integerfreq=m.get(str.charAt(i)); m.put(str.charAt(i),freq==null?1:freq+1); } //第二次扫描 for(int i=0;i { if(m.get(str.charAt(i))==1) { return i; } } return -1; } } 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。 import java.util.*; public class Solution { public StringPrintMinNumber(int [] numbers) { if(numbers==null||numbers.length<=0) return ""; String[]ss=new String[numbers.length]; for(int i=0;i ss[i]=numbers[i]+""; } Arrays.sort(ss,new Comparator public int compare(Stringo1,String o2){ return(o1+o2).compareTo(o2+o1); } }); StringBuildersb=new StringBuilder(); for(Stringeach:ss){ sb.append(each); } return sb.toString(); } } 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数 public class Solution { public int NumberOf1Between1AndN_Solution(int n) { int x=1; int count=0,k; for(int i=1;n/i>0;i*=10) { k=n/i; //k/10为高位数字 count+=(k/10)*i; int cur=k%10; if(cur>x) { count+=i; } else if(cur==x) { //n-k*i为低位数字 count+=n-k*i+1; } } return count; } }2、字符流中第一个不重复的字符
3、正则表达式匹配
4、构建成绩数组
5、数组中只出现一次的数字
6、数字在排序数组中出现的次数
7、数组中的逆序对
8、第一个只出现一次的字符
9、把数组排成最小的数
10、整数1出现的次数(从1到n整数中1出现的次数)