`
收藏列表
标题 标签 来源
大数相加算法 今天的华为面试
import java.math.BigInteger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class BigIntegerAddition {

	/**
	 * 题目:java实现两个大数相加,可能存在溢出。
	 * 如123456789 + 987654321 返回 1111111110
	 * 1.直接用BigInteger
	 * 2.模拟手算加法,进位相加
	 */
	public static void main(String[] args) {

		String x="23456789";
		String y="987654321";
		//use BigInter
		BigInteger a=new BigInteger(x);
		BigInteger b=new BigInteger(y);
		BigInteger c=a.add(b);
		System.out.println(c.toString());
		//"reinvent the wheel"
		String d=add(x,y);
		System.out.println(d);
		
	}

	//return x+y. Have not considered the negative number yet.
	public static String add(String x,String y){
		if(x==null||y==null){
			return null;
		}
		if(!isNumeric(x)||!isNumeric(y)){
			return null;
		}
		if(x.equals("0")){
			return y;
		}
		if(y.equals("0")){
			return x;
		}
		
		if(x.length()>y.length()){
			String tmp=x;
			x=y;
			y=tmp;
		}
		
		x=addZeroToFirst(x,y.length());
		String z=addHelp(x,y);
		return z;
	}
	
	public static String addHelp(String x,String y){
		String z="";
		int len=x.length();
		int[] a=toIntArray(x);
		int[] b=toIntArray(y);
		int[] c=new int[len+1];
		int d=0;//to carry. No need to use int[]
		for(int i=0;i<len;i++){
			int tmpSum=a[len-1-i]+b[len-1-i]+d;
			c[len-i]=tmpSum%10;
			d=tmpSum/10;
		}
		c[0]=d;
		StringBuilder sb=new StringBuilder();
		for(int i=0;i<=len;i++){
			sb.append(c[i]);
		}
		if(c[0]==0){//delete the first '0' in result string
			z=sb.substring(1);
		}else{
			z=sb.toString();
		}
		return z;
	}
	

	//String - toCharArray - toIntArray
	public static int[] toIntArray(String str){
		int len=str.length();
		int[] result=new int[len];
		for(int i=0;i<len;i++){
			result[i]=str.charAt(i)-'0';
		}
		return result;
	}
	
	//("123",5)-->"00123"
	public static String addZeroToFirst(String str,int length){
		StringBuilder sb=new StringBuilder();
		int diff=length-str.length();
		while(diff>0){
			sb.append("0");
			diff--;
		}
		sb.append(str);
		return sb.toString();
	}
	
	public static boolean isNumeric(String str){
		Pattern p=Pattern.compile("[0-9]*");
		Matcher isNum=p.matcher(str);
		return isNum.matches();
	}
}

单例模式php实现
<?php 

/**
 * 设计模式之单例模式
 * $_instance必须声明为静态的私有变量
 * 构造函数和析构函数必须声明为私有,防止外部程序new
 * 类从而失去单例模式的意义
 * getInstance()方法必须设置为公有的,必须调用此方法
 * 以返回实例的一个引用
 * ::操作符只能访问静态变量和静态函数
 * new对象都会消耗内存
 * 使用场景:最常用的地方是数据库连接。 
 *         使用单例模式生成一个对象后,
 *         该对象可以被其它众多对象所使用。 
 */
class Example
{
    //保存例实例在此属性中
    private static $_instance;
    
    //构造函数声明为private,防止直接创建对象
    private function __construct()
    {
        echo 'I am Construceted';
    }
    
    //单例方法
    public static function singleton()
    {
        if(!isset(self::$_instance))
        {
            $c=__CLASS__;
            self::$_instance=new $c;
        }
        return self::$_instance;
    }    
    
    //阻止用户复制对象实例
    public function __clone()
    {
        trigger_error('Clone is not allow' ,E_USER_ERROR);
    }
    
    function test()
    {
        echo("test");
        
    }
}

// 这个写法会出错,因为构造方法被声明为private
$test = new Example;

// 下面将得到Example类的单例对象
$test = Example::singleton();
$test->test();

// 复制对象将导致一个E_USER_ERROR.
$test_clone = clone $test;
?>
观察者模式php实现

<?php
interface IObserver
{
  function onChanged( $sender, $args );
}

interface IObservable
{
  function addObserver( $observer );
}

class UserList implements IObservable
{
  private $_observers = array();

  public function addCustomer( $name )
  {
    foreach( $this->_observers as $obs )
      $obs->onChanged( $this, $name );
  }

  public function addObserver( $observer )
  {
    $this->_observers []= $observer;
  }
}

class UserListLogger implements IObserver
{
  public function onChanged( $sender, $args )
  {
    echo( "'$args' added to user list\n" );
  }
}

$ul = new UserList();
$ul->addObserver( new UserListLogger() );
$ul->addCustomer( "Jack" );
工厂模式php实现
<?php
    interface IUser{
        function getName();
    }

    class User implements IUser{
        public function __construct($uid){}

        public function getName(){
            return 'bobby';
        }
    }

    class UserFactoty{
        public static function create($uid){
            return new User($uid);
        }
    }

    $user = UserFactoty::create(10086);
    echo $user->getName();
排序算法php实现
<?php
    $arr = array(12,35,56,2,6,135,67,909,8907);
    $rs = qsort($arr);
    print_r($rs);

    function bsort($arr){
        $count = count($arr);
        if($count <= 1) return $arr;

        for($i=0; $i<$count; $i++){
            for($j=$count-1; $j>=$i; $j--){
                if($arr[$j] < $arr[$j-1]){
                    $tmp = $arr[$j];
                    $arr[$j] = $arr[$j-1];
                    $arr[$j-1] = $tmp;
                }
            }
        }
        return $arr;
    }

    function qsort($arr){
        $count = count($arr);
        if($count <= 1) return $arr;

        $key = $arr[0];
        $left_arr = array();
        $mid_arr = array();
        $right_arr = array();

        foreach($arr AS $v){
            if($v>$key){
                $right_arr[] = $v;
            }else if($v == $key){
                $mid_arr[] = $v;
            }else{
                $left_arr[] = $v;
            }
        }

        $left_arr = qsort($left_arr);
        $right_arr = qsort($right_arr);

        return array_merge($left_arr, $mid_arr, $right_arr);
    }
PHP Session验证码 比较全面的php session验证码
<?php
/*
* @Date 2011-2-24
* @Author hudeyong926
*/
session_start ();

function getCode($length = 32, $mode = 0) {
	switch ($mode) {
		case '1' :
			$str = '123456789';
			break;
		case '2' :
			$str = 'abcdefghijklmnopqrstuvwxyz';
			break;
		case '3' :
			$str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
			break;
		case '4' :
			$str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
			break;
		case '5' :
			$str = 'ABCDEFGHIJKLMNPQRSTUVWXYZ123456789';
			break;
		case '6' :
			$str = 'abcdefghijklmnopqrstuvwxyz1234567890';
			break;
		case '7' ://中文验证码
			break;
		default :
			$str = 'ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789';
			break;
	}
	$result = '';
	
	for($i = 0; $i < $length; $i ++) {
		if ($mode == 7) {
			$str [$i] = chr ( mt_rand ( 176, 215 ) ) . chr ( mt_rand ( 161, 249 ) );
			$str [$i] = iconv ( "GB2312", "UTF-8", $str [$i] ); //imagettftext是utf-8的,所以先转换下
			$result .= $str [$i];
		} else {
			$l = strlen ( $str ) - 1;
			$num = rand ( 0, $l );
			$result .= $str [$num];
		}
	}
	return $result;
}
//建立验证图片
function createAuthNumImg($randStr, $imgW = 100, $imgH = 40, $fontName) {
	header ( "content-type: image/png" );
	$image = imagecreate ( $imgW, $imgH );
	$color_white = imagecolorallocate ( $image, 255, 255, 255 );
	$color_gray = imagecolorallocate ( $image, 228, 228, 228 );
	$color_black = imagecolorallocate ( $image, 255, 102, 204 );
	$color_b = imagecolorallocate ( $image, 0, 0, 0 );
	for($i = 0; $i < 1000; $i ++) {
		imagesetpixel ( $image, mt_rand ( 0, $imgW ), mt_rand ( 0, $imgH ), $color_gray );
	}
	imagerectangle ( $image, 0, 0, $imgW - 1, $imgH - 1, $color_gray );
	for($i = 10; $i < $imgH; $i += 10) {
		imageline ( $image, 0, $i, $imgW, $i, $color_gray );
	}
	imagettftext ( $image, 16, 5, 3, 25, $color_b, $fontName, $randStr );
	for($i = 10; $i < $imgW; $i += 10) {
		imageline ( $image, $i, 0, $i, $imgH, $color_gray );
	}
	imagepng ( $image );
	imagedestroy ( $image );
}

$verifyCode = GetCode ( 5, 6 );
$_SESSION ['VERIFY_CODE'] = strtoupper ( $verifyCode );
createAuthNumImg ( $verifyCode, 110, 30, "font.ttf" ); //字体存放路径,如果你没有文件就去C:\WINDOWS\Fonts文件中找一个吧。
?>
Global site tag (gtag.js) - Google Analytics