编程实现:两个1,两个2....两个7,两个1之间有一个其他数,两个2之间有2个其他数...两个7之间有7个其他数。

cyl654809 2014-12-09 03:48:36
编程实现:两个1,两个2....两个7,两个1之间有一个其他数,两个2之间有2个其他数...两个7之间有7个其他数。
当时自己写的时候理解错误了,理解成两个1之间至少有一个其他数,两个2之间至少有2个其他数....这种了,这种我实现了。
但不符合要求。求大神编程实现.
JAVA \C\C++都可.
...全文
152 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
冥王之锤 2014-12-10
  • 打赏
  • 举报
回复
引用 6 楼 t_jl1979 的回复:
如果是以74开头的,那么这个数不存在。 楼主是否记错了?
昨天算错了,今天补一下,7,4位置已知,很快就可以算出来:
package test;

import java.util.ArrayList;
import java.util.List;

public class AllSort {
	public static void main(String[] args) {
		char buf[] = { '7', '4', '1', '1', '2', '2', '4', '3', '7', '5', '5', '6', '6', '3' };

		perm(buf, 2, buf.length - 1);
	}

	/**
	 * @param buf
	 * @param start
	 * @param end
	 */
	public static void perm(char[] buf, int start, int end) {
		if (start == end) {// 当只要求对数组中一个字母进行全排列时,只要就按该数组输出即可
			checkNum(buf, end);
		} else {// 多个字母全排列
			for (int i = start; i <= end; i++) {
				char temp = buf[start];// 交换数组第一个元素与后续的元素
				buf[start] = buf[i];
				buf[i] = temp;

				perm(buf, start + 1, end);// 后续元素递归全排列

				temp = buf[start];// 将交换后的数组还原
				buf[start] = buf[i];
				buf[i] = temp;
			}
		}
	}

	private static void checkNum(char[] buf, int end) {
		boolean flag = true;
		List<Character> tmpList = new ArrayList<>();
		for (int i = 0; i <= end; i++) {
			char tmp = buf[i];
			if (tmpList.contains(tmp)) {
				continue;
			}
			tmpList.add(tmp);
			int nextIndex = i + Integer.valueOf(tmp + "") + 1;
			if (nextIndex > end || buf[nextIndex] != tmp) {
				flag = false;
			}
		}
		if (flag) {
			System.out.println(buf);
		}
	}
}
结果是: 74151643752362
冥王之锤 2014-12-09
  • 打赏
  • 举报
回复
如果是以74开头的,那么这个数不存在。 楼主是否记错了?
cyl654809 2014-12-09
  • 打赏
  • 举报
回复
引用 4 楼 l359122505 的回复:
参考下这个代码:

class C {
    static void findSo(int[] a, int n) {
        for (int i = 0; i < 14; i++) {
            if (i + n + 1 < 14 && a[i] == 0 && a[i + n + 1] == 0) {
                a[i] = n;
                a[i + n + 1] = n;

                if (n == 7) {
                    for (int j = 0; j < 14; j++) {
                        System.out.print(a[j]);
                    }
                    System.out.print("\n");
                } else {
                    findSo(a, n + 1);
                }
                a[i] = 0;
                a[i + n + 1] = 0;
            }
        }
    }

    public static void main(String[] args) {
        int[] a = new int[14];
        findSo(a, 1);
    }
}
正解. 这样的方法我发帖子前试过.但是跑起来结果有误,可能是我判断的时候弄错了,同学要拆电脑就没调试。 谢谢啦,来者有分。
繁华终归落尽 2014-12-09
  • 打赏
  • 举报
回复
参考下这个代码:

class C {
    static void findSo(int[] a, int n) {
        for (int i = 0; i < 14; i++) {
            if (i + n + 1 < 14 && a[i] == 0 && a[i + n + 1] == 0) {
                a[i] = n;
                a[i + n + 1] = n;

                if (n == 7) {
                    for (int j = 0; j < 14; j++) {
                        System.out.print(a[j]);
                    }
                    System.out.print("\n");
                } else {
                    findSo(a, n + 1);
                }
                a[i] = 0;
                a[i + n + 1] = 0;
            }
        }
    }

    public static void main(String[] args) {
        int[] a = new int[14];
        findSo(a, 1);
    }
}
cyl654809 2014-12-09
  • 打赏
  • 举报
回复
引用 1 楼 u012171905 的回复:
我觉得楼主已经实现的比原来的这样要难一点啊,难的都有了,简单的还不会么
这道题是当时考试时候现场编的,现在没思路阿。看看有没有高手请教一下。 下面是我当时写的代码:

import java.util.Scanner;

/**
 * 
 * @author Cyl-29
 *
 */

/**
 * 7对数(1-7),组成一个14位的数.
 * 要求两个1之间有1个其他数字,
 * 两个2之间有2个其他数字……
 * 两个7之间有7个其他数字。
 * 
 * 例子:忘记了 * 
 * 编程找出74开头的这14位数.
 */



public class Qi {
	
	static int num[] = new int[15];
	static int vis[] = new int[8];
	
	static void print(){
		for(int i=1; i<15; i++){
			System.out.print(num[i]);
		}
		System.out.println();
		//暂停.
		Scanner cin = new Scanner(System.in);
		cin.nextLine();
	}
	
	static void dfs(int begin,int n){
		if(begin == n){
			print();
		}else{
			for(int i=7; i>0; i--){
				
				//短路加快程序运行.
				if(i==7 && begin<9)
					continue;
				
				if(i==4 && begin<7)
					continue;
	
				int min = begin-i>0?begin-i:0;
				boolean flag = true;
				if(i>=3 && i<=6){
					for(int j=begin-1; j>min; j--){
						if(i==num[j])
							flag = false;//
					}
				}
				
				if(i==1 && num[begin-1]==1)
					continue;
				if(i==2 && (num[begin-1] == 2 || num[begin-2] == 2) )
					continue;
			
				if(flag && vis[i]<2){
					vis[i]++;
					num[begin] = i;
					dfs(begin+1,n);
					vis[i]--;
				}
			}
		}
	}
	public static void main(String []args){
		//74开头.
		num[1] = 7; num[2] = 4;
		//74各使用一次.
		vis[7] = 1; vis[4] = 1;
		
		dfs(3,15);
	}
}
wyc_ 2014-12-09
  • 打赏
  • 举报
回复
同意楼上
Coder_D 2014-12-09
  • 打赏
  • 举报
回复
我觉得楼主已经实现的比原来的这样要难一点啊,难的都有了,简单的还不会么
内容概要:《中国银保监会监管据安全管理办法(试行)》旨在规范监管据的安全管理,提升据保护能力,防范安全风险。办法明确了监管据的定义、范围及其在采集、存储、处理、使用、委托服务及销毁等全生命周期中的安全管理要求。强调据应依法合规采集,通过专用网络传输,存储于安全环境,并实施分级分类防护措施。对据使用限定了用途和设备范围,要求脱敏处理和可追溯管理,并严格管控对外提供和跨境共享。针对委托服务机构设定了准入条件和协议管理机制,明确安全责任。同时建立自查、评估、检查和应急报告机制,确保据安全事件及时处置和上报。; 适合人群:银保监会及其派出机构工作人员、受托提供监管据服务的企事业单位、金融机构信息技术与据管理人员。; 使用场景及目标:①指导监管据全生命周期的安全管理实践;②规范受托机构的服务准入与安全管理;③建立健全据安全风险防控与应急响应机制;④支持监管据在合规前提下的有效利用与共享。; 阅读建议:本办法具有较强的政策性和操作性,建议结合实际工作流程对照执行,重点关注据分类、权限控制、技术防护和应急管理等方面要求,并定期开展合规自查与培训。
内容概要:本文系统性地介绍了编程语言进阶的学习路径与实战项目实践,涵盖主流技术栈(Python、Java、Go、Rust)的优劣势分析,针对高并发性能优化、业务逻辑可维护性、据处理效率等行业痛点提供具体解决方案,并结合设计模式与代码示例深入讲解。文章重点通过构建一个基于FastAPI的简易电商平台后端,演示了从技术选型、核心编码到项目优化的完整流程,强调性能调优、架构设计与实际工程问题的应对策略。最后提出进阶建议,倡导深入底层原理、掌握云原生技术、参与开源项目以持续提升技术能力。; 适合人群:具备一定编程经验,希望提升系统设计能力和工程实战水平的1-3年开发者,以及准备向中高级工程师进阶的技术人员。; 使用场景及目标:①帮助开发者在不同技术路线间做出合理选型决策;②掌握高并发、分布式、缓存等关键技术的实际应用;③通过完整项目实践理解Web后端开发全流程并积累可迁移经验;④提升对框架底层原理和系统性能优化的理解。; 阅读建议:建议边读边动手实现文中的代码示例与项目模块,结合调试与性能测试加深理解,同时延伸学习文中提到的底层机制(如GIL、goroutine、ORM原理)和工具链(Docker、Redis、JWT),以构建完整的知识体系。

51,408

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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