1.转变数组后最接近目标值的数组和
import java.util.Arrays;publicclasstext{
publicintfindBestValue(int[] arr,int target){
int sum =0;int i =0;for(i =0; i < arr.length; i++){
sum += arr[i];}if(sum <= target){
Arrays.sort(arr);return arr[arr.length -1];}int left =0;int right = arr[arr.length -1];while(left <= right){
int mid =(left + right)/2;
sum =judge(arr, mid);if(sum == target)return mid;elseif(sum > target) right = mid -1;else left = mid +1;}//当结束二分查找还没找到目标值时,left值在right右边,即left比right大1,我们判断这两个值哪个最接近target。if(Math.abs(judge(arr, left)- target)< Math.abs(judge(arr, left -1)- target))return left;elsereturn left -1;}publicintjudge(int[] arr,int value){
int sum =0;int i=0;for(i=0;i<arr.length;i++){
if(arr[i]<value){
sum += arr[i];}else
sum += value;}return sum;}}
3.最长公共前缀
//横向扫描publicclasstext{
public String longestCommonPrefix(String[] strs){
//这个判断必须要加,例子中有str=null的情况if(strs.length ==0|| strs == null){
return"";}//让第一个值全部成为最长前缀,然后一个个比较
String Prefix = strs[0];int j;int len =0;for(j =1; j < strs.length; j++){
Prefix =longestCommonPrefix(Prefix, strs[j]);if(Prefix.length()==0)return"";}return Prefix;}private String longestCommonPrefix(String prefix, String str){
int len = Math.min(prefix.length(), str.length());int index =0;while(index < len && prefix.charAt(index)== str.charAt(index)){
index++;}return prefix.substring(0, index);}}//分治法classSolution{
public String longestCommonPrefix(String[] strs){
if(strs.length ==0|| strs == null){
return"";}else{
returnlongestCommonPrefix(strs,0,strs.length-1);}}private String longestCommonPrefix(String[] strs,int begin,int end){
if(begin==end){
return strs[begin];}else{
int mid =(begin+end)/2;
String left =longestCommonPrefix(strs,begin,mid);
String right =longestCommonPrefix(strs,mid+1,end);returnlongestCommonPrefix(left,right);}}private String longestCommonPrefix(String prefix, String str){
int len = Math.min(prefix.length(), str.length());int index =0;while(index < len && prefix.charAt(index)== str.charAt(index)){
index++;}return prefix.substring(0, index);}}
4.整数反转(借鉴大神)
intmax=2147483647
intmin=-2147483648(java)publicclasstext{
publicintreverse(int x){
int sum =0;while(x!=0){
//当sum*10溢出时,/10就不等于原来的数if((sum*10)/10!=sum){
return0;}
sum = sum*10+x%10;
x = x/10;}return sum;}}
5.回文数
//菜鸡做法,利用一个数组作为媒介publicclasstext{
publicbooleanisPalindrome(int x){
if(x<0){
returnfalse;}if(x==0){
returntrue;}int temp = x;int num =0;while(temp!=0){
temp=temp/10;
num++;}int[] a =newint[num];int i =0;for(i=0;i<num;i++){
a[i]= x%10;
x = x/10;}for(i=0;i<num/2;i++){
if(a[i]!=a[num-i-1]){
returnfalse;}}returntrue;}}//官方做法publicclasstext{
publicbooleanisPalindrome(int x){
//当x小于0,或者x的个位数为0,但x!=0时,x不可能为回文数if(x <0||(x %10==0&& x !=0)){
returnfalse;}//设置x的一半相反数,当x<reversenum时停止,当x为回文数时,x的后半部分会与前半部分相等int reversenum =0;while(x > reversenum){
reversenum = reversenum *10+ x %10;
x = x /10;}return reversenum == x || reversenum /10== x;}}