趣味算法題-3

1.給出N和K還有一串數字字符串,按最小的代價把字符串變爲K個相同數字的字符串,代價爲原數字變爲該數字後的差值。

public static void phoneNumber()
	{
		Scanner in = new Scanner(System.in);
		int N = in.nextInt();
		int K = in.nextInt();
		String s = in.next();
		StringBuilder result = new StringBuilder();
		int res = Integer.MAX_VALUE;
		for(int i = 0; i < 10; i++)
		{
			StringBuilder sb = new StringBuilder(s);
			int p = K;
			int c = 0;
			for(int j = 0; j < 10; j++)
			{
				
				for(int l = 0; l < N; l++)
				{
					if(p != 0 && (int)(sb.charAt(l)-'0') == i+j)
					{
						p--;
						sb.setCharAt(l, (char)(sb.charAt(l)-j));
						c += j;
					}
					if(j != 0)
					{
						if(p != 0 && sb.charAt(l)-'0' == i-j)
						{
							p--;
							sb.setCharAt(l, (char)(sb.charAt(l)+j));
							c += j;
						}
					}
				}
				
			}
			if(res > c)
			{
				res = c;
				result = sb;
			}
		}
			
		System.out.println(res);
		System.out.println(result.toString());
		
	}

2.單項鍊表的快速排序

public static void Quick(LinkNode ln)
	{
		if(ln == null || ln.next == null)
			return;
		Quick(ln, null);
	}
	public static void Quick(LinkNode pHead, LinkNode tail)
	{
		if(pHead == null || pHead.next == tail)
			return;
		LinkNode pivot = partition(pHead, tail);
		partition(pHead, pivot);
		partition(pivot.next, tail);
	}
	public static LinkNode partition(LinkNode pHead, LinkNode tail)
	{
		if(pHead == null || pHead.next == tail)
			return pHead;
		LinkNode pivot = pHead;
		int key = pivot.val;
		for(LinkNode pNode = pHead.next; pNode != tail; pNode = pNode.next)
		{
			if(pNode.val < key)
			{
				pivot = pivot.next;
				swap(pivot, pNode);
			}
		}
		swap(pivot, pHead);
		return pivot;
	}
	public static void swap(LinkNode l1, LinkNode l2)
	{
		int temp = l1.val;
		l1.val = l2.val;
		l2.val = temp;
	}

3.最大合法括號長度

測試用例:()(()

import java.util.Scanner;
import java.util.Stack;

public class validBlacket {

	public validBlacket() {
		// TODO Auto-generated constructor stub
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in = new Scanner(System.in);
		String str = in.nextLine();
		int[] flag = new int[str.length()];
		Stack<Integer> stack = new Stack<Integer>();
		for(int i = 0; i < str.length(); i++)
		{
			if(str.charAt(i) == '(')
				stack.push(i);
			if(str.charAt(i) == ')' && !stack.isEmpty())
			{
				int j = stack.peek();
				if(str.charAt(j) == '(')
				{
					flag[j] = flag[i] = 1;
				}
				stack.pop();
			}
		}
		int maxLen = 0;
		int vLen = 0;
		
		for(int i = 0; i < str.length(); i++)
		{
			if(flag[i] == 1)
			{
				vLen++;
			}
			else
			{
				maxLen = Math.max(maxLen, vLen);
				vLen = 0;
			}
		}
		System.out.println(maxLen);
	}

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章