LeetCode上Largest Number

public class Solution {
    //思路
    //先使用transfer函数   将int数组转为Node型数组  一个Node里面存储一个char类型  把每个int型每一位都变为char类型 
    //如1402  则变为 '1'->'4'->'0'->'2'
    //现在则数组transfer成如下的样子
    //  myNode[0]-->'3'   
    //  myNode[1]-->'3'-->'0'  
    //  myNode[2]-->'3'-->'4'  
    //  myNode[3]-->'5'  
    //  myNode[3]-->'9' 
    
    //然后对这个数组进行快速排序
    
    
    //现在的关键就是快速排序两个数的大小如何定义?
    //所以设计compare函数比较 myNode[i]  myNode[j]
    //比较方式是: 都从头指针数据开始比  相同则同时向后
    
    //如果数字完全相同,直到其中一个到结尾 另一个后面还有数字怎么办?  
    //如  384    38447   
    //那么取38447的头指针和 刚刚的指针(38447现在已经走到4的指针)  再循环上一步的比较即
    //       38447(取头指针)
    // 384   47 (38447现在已经走到4的指针)  
    //比较方式同上      
    //如果依然走到底  如
    //      38438438
    // 384  38438         
    //此时则应该取上面多的数4  与这一串数字的开头比较(即3)  这样得出大小关系
    
    public static String largestNumber(int[] num) {
        
    	Node[] myNode=new Node[num.length];
    	transfer(myNode,num);
    	
    	if(num.length==0)  		return "";
    	quickSort(myNode,0,myNode.length-1);
    	StringBuffer result=new StringBuffer();
    	for(int i=0;i<myNode.length;i++){
    		while(myNode[i]!=null){
    			result.append(myNode[i].num);
    			myNode[i]=myNode[i].next;
    		}
    	}
    	
    	//记录字符串开头有几个0
    	int z=0;
    	for(int k=0;k<result.length();k++){
    		if(result.charAt(k)=='0')
    			z++;
    		else
    			break;
    	}
    	if(z>1){
    		result.delete(0, z-1);
    	}
		
    	return result.toString();
    }

	private static void transfer(Node[] myNode, int[] num) {
		// TODO Auto-generated method stub
		
		for(int i=0;i<num.length;i++){
			int temp=num[i];
			//进行除法剩下的数
			int a=0;
			//进行取余剩下的数
			int b=0;
			do{
				b=temp%10;
				Node newNode=new Node((char)(b+'0'));
				//头插法
				Node tempNode=myNode[i];
				myNode[i]=newNode;
				newNode.next=tempNode;
			}while((temp=temp/10)>0);
		}
	}

	private static void quickSort(Node[] myNode,int left,int right) {
		// TODO Auto-generated method stub
		if(left>=right)		return ;

		int place=findPlace(myNode,left,right);
		quickSort(myNode,left,place-1);
		quickSort(myNode,place+1,right);
	}

	private static int findPlace(Node[] myNode, int left, int right) {
		// TODO Auto-generated method stub
		int i=left;
		int j=left+1;
		
		for(;j<=right;j++){
			if(compare(myNode,left,j)){
				i++;
				swap(myNode,i,j);
				continue;
			}
		}
		swap(myNode,left,i);
		return i;
	}

	private static void swap(Node[] myNode, int i, int j) {
		// TODO Auto-generated method stub
		Node temp=myNode[i];
		myNode[i]=myNode[j];
		myNode[j]=temp;
	}

	//因为要逆序     i大的  返回false
	private static boolean compare(Node[] myNode, int i, int j) {
		// TODO Auto-generated method stub

		Node node1=myNode[i];
		Node node2=myNode[j];
	
		while(node1!=null&&node2!=null){
			if(node1.num>node2.num)
				return false;
			else if(node1.num<node2.num)
				return true;
			else if(node1.num==node2.num){
				node1=node1.next;
				node2=node2.next;
			}
		}

		if(node1!=null)	{
			Node tempN=myNode[i];
			while(node1!=null){
				if(node1.num>tempN.num)
					return false;
				else if(node1.num<tempN.num)
					return true;
				else if(node1.num==tempN.num){
					node1=node1.next;
					tempN=tempN.next;
				}
			}
			if(tempN.num>myNode[i].num)
				return true;
			else
				return false;
		}
			
		if(node2!=null){
			Node tempN=myNode[j];
			while(node2!=null){
				if(node2.num>tempN.num)
					return true;
				else if(node2.num<tempN.num)
					return false;
				else if(node2.num==tempN.num){
					node2=node2.next;
					tempN=tempN.next;
				}
			}
			if(tempN.num>myNode[j].num)
				return false;
			else
				return true;
		}

		return false;
	}
}


class Node{
	public Node(char b) {
		// TODO Auto-generated constructor stub
		num=b;
	}
	char num;
	Node next;
}


后来查资料看到其他博客中也有使用拼接两个数A和B    然后比价AB和BA大小关系从而得到A与B的大小关系的   那种方式可能更加巧妙

我的方式比较原始,有问题的地方还望大家批评指正

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值