这个文件编码规则怎么搞?

zhkoy1212 2012-12-13 09:59:17
现在需要设计一个文件编码规则,起始值为A00A,当再次编码的时候变为A00B,然后一直这样到A00Z,跳到A0AA,然后是A0AB这样一直到A0AZ,然后是A0BA,就这样到A0BZ,最后的值为ZZZZ,然后任何一位都不能使I、O、X,就是哦了A00H的时候,跳过AOOI,到AOOJ, 就是这样,这个真不会,有一点,起始值中的是零不是O,求帮!!!
...全文
211 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhkoy1212 2012-12-15
  • 打赏
  • 举报
回复
貌似都有点不对,到AOOZ的时候,应该变为AOAA,但是你们都变成了AOAO。。。
wapigzhu 2012-12-14
  • 打赏
  • 举报
回复
其实有个更清晰的思路是你可以看作24(26 - 3 + 1)进制数 每次先转回10进制,+1,然后再转到24进制, 这样思路很清楚不过效率要低
wapigzhu 2012-12-14
  • 打赏
  • 举报
回复
你的看着有点晕,自己写了个,main里面全是测试用的代码,方法是increase(String str)这个,传一个当前的进去,返回一个增大1的,目测没有问题....

public class ReaderTest {
	private static final char[] bits = new char[24];
	
	static{
		bits[0] = '0';
		int index = 1;
		for(int i = 0; i < 26; i ++){
			char c = (char) ('A' + i);
			if(c != 'I' && c != 'O' && c != 'X')
				bits[index ++] = c;
		}
	}

	private static String increase(String str){
		char[] charArray = str.toCharArray();
		for(int i = 0; i < charArray.length; i ++){
			int posInArray = charArray.length - 1 - i;
			int pos = getPosInBits(charArray[posInArray]);
			if(pos + 1 >= bits.length)
				charArray[posInArray] = '0';
			else{
				charArray[posInArray] = bits[pos + 1];
				break;
			}
		}
		return new String(charArray);
	}
	
	private static int getPosInBits(char c){
		for(int i = 0; i < bits.length; i ++){
			if(bits[i] == c)
				return i;
		}
		return -1;
	}

	public static void main(String[] args) throws IOException {
		for(int i = 0; i < 100; i ++){
			char[] randomChar = new char[4];
			for(int j = 0; j < randomChar.length; j ++)
				randomChar[j] = bits[(int) (Math.random() * bits.length)];
			String targetString = new String(randomChar);
			System.out.println("[" + targetString + "] increate 1 to :[" + increase(targetString)+ "]");
		}
	}
}

  • 打赏
  • 举报
回复
将0A-Z 的24个字符作为字符放入一个字符数组当中, 每次变化,可以认为是24进制的加法运算. public class Test { private char[] store = new char[] { '0', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'Y', 'Z' }; private int[] nums ; public Test(String value){ init(value); } private void init(String value){ char[] tmp = value.toCharArray(); nums = new int[tmp.length]; int i = tmp.length-1; for(char ch:tmp){ nums[i--]=find(ch); } } private int find(char ch){ return find(ch,0,store.length); } private int find(char ch,int low,int hight){ int mid = (low+hight)/2; if(ch==store[mid]) return mid; if(ch<store[mid]){ return find(ch,low,mid); }else{ return find(ch,mid,hight); } } public String increase(){ increase(0); return getValue(); } private String getValue(){ int size = nums.length; char[] values = new char[size]; size--; for(int i : nums){ values[size--]=store[i]; } return new String(values); } private void increase(int i ){ if(i==nums.length){ int[] tmp = new int[i+1]; System.arraycopy(nums, 0, tmp, 0, i); nums=tmp; } int num = nums[i]; num++; if(num==store.length){ nums[i]=0; increase(++i); }else{ nums[i]=num; } } /** * @param args */ public static void main(String[] args) { Test test = new Test("A00A"); System.out.println(test.increase()); } }
zhkoy1212 2012-12-13
  • 打赏
  • 举报
回复
public class Test11 { public static void main(String[] args) { generateNumber(); } public static void generateNumber() { String startNumber = "A00A"; //开始工号 String newNumber = startNumber; //新的工号 int numberLength = startNumber.length(); int iCount = 0; while (newNumber != "ZZZZ") { newNumber = startNumber; char[] newNumberArray = newNumber.toCharArray(); char[] startNumberArray = startNumber.toCharArray(); int tempCount = iCount; for (int i = numberLength; i > 0; --i) { int div = (int)(Math.pow(26.0, i - 1)); //根据当前是第几位,来选定除数 分别为26的三次方,26的二次方等等 int charIndex = numberLength - i; //当前是第几位工号 newNumberArray[charIndex] += (tempCount / div); tempCount %= div; if (newNumberArray[charIndex] == 'I' || newNumberArray[charIndex] == 'O' || newNumberArray[charIndex] == 'X') { newNumberArray[charIndex] += 1; iCount += div; //当是I、O、X的时向前跳一位,值得注意的是iCount并不是加1,当时最低位时+1,次低位时+26, } if (newNumberArray[charIndex] == '1') { newNumberArray[charIndex] = 'A'; //当是有0进位来的时候,改写成A startNumberArray[charIndex] = 'A'; iCount -= div; //当是0时,改写成A,相当于向后跳了一位,所以减 (27 - 26),如果不减的话,就变成了BB了 } } //cout << newNumber << endl; System.out.println(new String(newNumberArray)); iCount++; } } } 不知道哪里错了。。

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧