精华内容
下载资源
问答
  • 方法是,先假设某空格中可填入九个数字,然后去掉所在行、所在、所在宫中已有数字。余下如果是唯一一个数字,那么这个数字就是结果 2、找唯一法:例如果某行、某或某宫中只剩一个空格,那么九个数字中缺少...
  • oracle数据库经典题目

    2011-02-17 15:05:20
    而表级约束定义独立于列的定义,它可以应用于一个表中多个。 13.填写下面语句,使其可以为Class表ID添加一个名为PK_CLASS_ID主键约束。 ALTER TABLE Class Add ____________ PK_LASS_ID (Constraint...
  • 一个n行m列的矩阵被划分成t个矩形区域,分别用数字1-t来标识,同一个区域内元素都用同一个数字标识。如下图所示,一个6行8列的矩阵被分成8个矩形区域,分别用编号1-8标识。当两个小区域之间公用一条边时,称这两个...

    题目如下:

    一个n行m列的矩阵被划分成t个矩形区域,分别用数字1-t来标识,同一个区域内的元素都用同一个数字标识。如下图所示,一个6行8列的矩阵被分成8个矩形区域,分别用编号1-8标识。当两个小区域之间公用一条边时,称这两个区域相邻,例如下图中区域5的相邻区域有6个,分别为1,2,3,6,7,8,但4并不是它的相邻区域。请写一个程序找出区域k的所有相邻区域。
    在这里插入图片描述
    输入说明

    输入第一行为四个整数n,m, t,k,整数之间用空格分隔。n表示矩阵行数(n<20),m表示矩阵列数(m<20),t表示矩阵被划分为t个矩形区域(0<t<50),k为其中某个区域的编号(1<=k<=t)。接下来是n行数据,每行m个整数,表示矩阵内各个元素所在的区域,整数之间用空格分隔。

    输出说明

    输出为一个整数,表示与k相邻的区域个数

    输入样例

    6 8 8 5
    1 1 2 2 2 3 3 4
    1 1 2 2 2 3 3 4
    1 1 2 2 2 3 3 4
    1 1 5 5 5 5 5 6
    1 1 5 5 5 5 5 6
    7 7 7 7 7 8 8 8

    输出样例

    6

    .
    .
    .
    此问题看似复杂,其实分解成几个小问题去逐一解决,代码很容易就可以写出。我们用二维数组处理数据,遇到如下几个问题:
    【我们首先将整个数字网络置于一个类平面直角坐标系中,双重循环变量i和j分别控制列(y轴)和行(x轴)的变化,具体的图解如下】:
    在这里插入图片描述

    ①如何定位数字为k的矩形?
    →我们知道,矩形有四条边。而一个矩形的大小和位置可以仅由“左上角”和“右下角”两个点的位置来确定(就像我们在电脑中拉出矩形框一样)。所以,我们需要获得数字为k的矩形的位置,只需要获得这两个点的坐标(xmin,ymin)和(xmax,ymax)。见上图。

    ②如何统计相邻的区块数?
    →如此的单纯的数字统计,我倾向于之前介绍过的“计数器judge”方法。【详见博客https://blog.csdn.net/GalaxyerKw/article/details/110310346
    对该矩形周围一圈(正上,正下,正左,正右)的数字进行遍历判断。

    ③如何保证遍历判断时,数组不越界?
    →在对应的for循环内增加if条件限制即可。
    .
    .
    .
    解决了上述问题,我们就可以写代码了:

    #include<stdio.h>
    
    int main(void)
    {
      int n,m,t,k;  //n表示矩阵行数(n<20),m表示矩阵列数(m<20),t表示矩阵被划分为t个矩形区域(0<t<50),k为其中某个区域的编号(1<=k<=t)。
      scanf("%d%d%d%d",&n,&m,&t,&k);
      int p[n][m];
      int i,j;
     for (i=0; i<=n-1; i++)
     {
       for (j=0; j<=m-1; j++)
       {
         scanf("%d",&p[i][j]);
       }
     }
       //思路是先找出数字为k的矩形所在位置,再在其周围一圈遍历,看有几个不同的数
      int xmin,ymin,xmax,ymax;
      int flag=1;
     for (i=0; i<=n-1; i++)    //最左上坐标(xmin,ymin)
     {
       for (j=0; j<=m-1; j++)
       {
         if (p[i][j]==k)
         {
           xmin=j;
           ymin=i;
           flag=0;
         }
         if (flag==0)  break;
       }
        if (flag==0)  break;
     }
    
     for (i=n-1; i>=0; i--)   //最右下坐标(xmax,ymax)
     {
       for (j=m-1; j>=0; j--)
       {
         if (p[i][j]==k)
         {
           xmax=j;
           ymax=i;
           flag=1;
         }
         if (flag==1)  break;
       }
        if (flag==1)  break;
     }
    
       //调试位置坐标是否正确,可用下方注释中的程序:
       //printf("\n%d %d %d %d\n",xmin,ymin,xmax,ymax);
    
      int judge[t+1];  //开辟计数器0-t并归零
     for (i=0; i<=t; i++) {judge[i]=0;}
    
      for (j=xmin; j<=xmax; j++)  //同时检验上边和下边一行
      {
          if (j>=0 && j<=m-1 && ymin-1>=0)   //上方不能越界
          {
              judge[p[ymin-1][j]]++;
          }
          if (j>=0 && j<=m-1 && ymax+1<=n-1)  //下方不能越界
          {
              judge[p[ymax+1][j]]++;
          }
      }
      for (i=ymin; i<=ymax; i++) //再同时检验左边和右边一行
      {
          if (i>=0 && i<=n-1 && xmin-1>=0)  //左方不能越界
          {
              judge[p[i][xmin-1]]++;
          }
          if (i>=0 && i<=n-1 && xmax+1<=m-1) //右方不能越界
          {
              judge[p[i][xmax+1]]++;
          }
      }
        //此时计数器已经储存完毕所有出现过的数字,现在开始遍历计数器
      int sum=0;
      for (i=0; i<=t; i++)
      {
          if (judge[i]!=0)  sum++;
      }
      printf("%d",sum);
    
     return 0;
    }
    
    

    此题并不难,但是其思想值得我们学习。
    其思想的精华在于,将一个二维数字数组置于一个类平面直角坐标系中,通过坐标进行判断与计算,同时使用了便于统计的“计数器judge”方法。

    当然,这道题目一定还有更加简单的实现方法,望大家学习与交流,本篇文章不足之处请多多包涵与指正。

    展开全文
  • 题目描述:在一个二维数组中,每行数字从左到右递增,每列数字从上到下递增,给定一个整数,判断该数是否存在于二位数组之中. 解决方法: 我们可以从右上角开始: 如果该数恰好等于要查找数,则返回true. 如果该数小于...

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4249122.html

    题目描述:在一个二维数组中,每行数字从左到右递增,每列数字从上到下递增,给定一个整数,判断该数是否存在于二位数组之中.

    解决方法:

    我们可以从右上角开始:

    如果该数恰好等于要查找的数,则返回true.

    如果该数小于要查找的数,说明这一行的数都小于要查找的数,于是删除第一行继续查找.

    如果该数大于要查找的数,说明这一列都大于要查找的数,于是删除这一列继续查找.

    最后如果都没有找到,则返回false.

    需要注意的是,在c语言中,二维数组作为参数传递的时候需要注明第二维的大小例如find(int a[][4]),但是这样就会把数组第二维大小定死,

    所以使用了一位数组代替二维数组而把寻址方式由a[x][y]变为a[x*column+y]的方式,并需要把二位数组的地址进行强制转换,代码如下:

     

     1 #include <stdio.h>
     2 #include <iostream>
     3 
     4 using namespace std;
     5 
     6 bool find(int * Matrix , int rows, int columns, int number)
     7 {
     8     bool found = false;
     9     if( Matrix != NULL && rows > 0 && columns > 0 )
    10     {
    11         int row = 0;
    12         int column = columns - 1;
    13         while( row < rows && column >= 0 )
    14         {
    15             if( Matrix[row * columns + column] == number )
    16             {
    17                 found = true;
    18                 break;
    19             }
    20             else if( Matrix[row * columns + column] < number )
    21             {
    22                 ++row;
    23             }
    24             else
    25             {
    26                 --column;
    27             }
    28         }
    29     }
    30     return found;
    31 }
    32 
    33 int main(int argc, char *argv[])
    34 {
    35     int Matrix[4][4] =  
    36     {
    37         {1, 2, 8, 9}, 
    38         {2, 4, 9, 12}, 
    39         {4, 7, 10, 13}, 
    40         {6, 8, 11, 15}
    41     };
    42     cout<<find((int*)Matrix, 4, 4, 6)<<endl;
    43 }

     

    转载于:https://www.cnblogs.com/jostree/p/4249122.html

    展开全文
  • 采用和剑指offer上一样的方法,从二维数组右上角元素开始比较,相等就直接返回,如果元素比查找的数字大就剔除这一,比查找的数字小就剔除这一行,逐渐遍历直到找到该数字或者到左下角元素后说明没有这个...

    题目要求:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
    本人思路:采用的和剑指offer上一样的方法,从二维数组的右上角的元素开始比较,相等就直接返回,如果元素比查找的数字大就剔除这一列,比查找的数字小就剔除这一行,逐渐遍历直到找到该数字或者到左下角的元素后说明没有这个数字!还有一些具体的想法思路会在代码中逐行解释,记录思路的同时希望帮助一些小白更好地理解,代码如下所示:

    #include<iostream>
    #include <vector>
    using namespace std;
    
    class Solution {
    public:
    	//采用vector类型表示二维数组,因为采用二维指针int **array或int array[][]都不行,具体原因暂不知
    	bool Find(int target, vector<vector<int>> array) {
    		//判断二维数组的行列是否为空,空就直接返回false
    		if (array.size() == 0 || array[0].size() == 0)
    			return false;
    		//获取数组的最大行号=行数-1
    		int rows = array.size() - 1;
    		//获取数组的最大列号=列数-1
    		int columns = array[0].size() - 1;
    		/*用i,j来表示当前元素位置的下标,因为是从二维数组的右上角开始,
    		所以行号i从0开始,也就是第一行,列号j从最后一列开始。*/
    		int i = 0, j = columns;
    		/*开始循环遍历,因为是从右上角开始往左下方向进行,所以i不能超过最大行号,
    		j不能小于最小列号0,否则就超出数组的范围了*/
    		while (i <= rows && j >= 0)
    		{
    			//找到目标数字,直接返回true
    			if (target == array[i][j])
    				return true;
    			//大于目标数字,剔除该列
    			else if (array[i][j] > target)
    				--j;
    			//小于目标数字,剔除该行
    			else
    				++i;
    		}
    		//遍历完没找到,说明没有这个数
    		return false;
    	}
    };
    
    int main()
    {
    	//vector二维数组的初始化的格式!!!
    	vector<vector<int>> array = { {1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15} };
    	int num = 6;
    	Solution s;
    	if (s.Find(num, array))
    		cout << "有这个数" << endl;
    	else
    		cout << "没有这个数" << endl;
    	system("pause");
    	return 0;
    }
    
    展开全文
  • 《剑指Offer》Java刷题 NO.11 二进制中1个数 传送门:《剑指Offer刷题总目录》 时间:2020-02-12 ...n,与结果为1就说明当前1位置在n二进制中对应的数字是1, (eg:n=1101,1101&0001=1;0110...

    《剑指Offer》Java刷题 NO.11 二进制中1的个数(位运算、找规律)

    传送门:《剑指Offer刷题总目录》

    时间:2020-02-12
    题目:
    输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。


    思路: 列出三种可行方法

    1. 每次将n右移一位,利用1&n,与的结果为1就说明当前1的位置在n的二进制中的对应的数字是1(eg:n=1101,1101&0001=1;0110&0001=0)
    计数1的个数,当n位移成0时退出循环(需要注意的是负数需要无符号右移>>>,高位补0,有符号右移会使得高位补1,最后陷入死循环)
    2.每次将1向左位移一位,利用1&n,与的结果为1就说明当前1的位置在n的二进制中的对应的数字是1
    (eg:n=1101,1101&0001=1;1101&0010=0)
    计数1的个数,当1位移成0时退出循环(缺点是这个地方需要循环32次直到1移出范围变成0,因为Java的int类型的位数是323.举个例子:一个二进制数1100,减去1后,第三位变成0,它后面的两位0变成了1,而前面的1保持不变,因此得到的结果是1011.
    我们发现减1的结果是把最右边的一个1开始的所有位都取反了。进行操作n&(n-1),那么从原来整数最右边一个1那一位开始所有位
    都会变成0。如1100&1011=1000.也就是说,把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0.那么一个整数的
    二进制有多少个1,就可以进行多少次这样的操作。
    

    负数也同样适用:
    在这里插入图片描述
    解释:

    对在java中,对于1<<32,那么会输出1;但是对于(1<<31)<<1,那么会输出0;是因为其底层对左移做了一些处理,
    即如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模。如对int型移动33位,实际上只
    移动了33%32=1位;对int型移动32位,实际上只移动了32%32=0.
    

    Java代码:

    /**
     * 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
     */
    public class NumberOfOne {
        /**
         *1.每次对n进行无符号右移一位,和1相与,将结果为1的情况进行计数,循环终止条件为n==0
         */
        public static int numberOfOne_1(int n){
            if(n==0) return 0;
            int count=0;
            while(n!=0){
                if((n&1)==1)
                    count++;
                n=n>>>1;//一定要无符号右移,不然n等于负数时由于高位补1,会陷入死循环
            }
            return count;
        }
    
        /**
         * 2.每次将1左移一位,然后n&1,同样计数结果为1的次数,循环结束条件为flag==0
         * flag需要位移32次才能结束循环,对于较小的n,效率较低
         */
        public static int numberOfOne_2(int n){
            if(n==0) return 0;
            int flag=1;
            int count=0;
            while(flag!=0){
                if((n&flag)!=0)
                    count++;
                flag=flag<<1;//flag需要位移32次才能结束循环,对于较小的n,效率较低
            }
            return count;
        }
    
        /**
         *3.利用n&(n-1)可以把最右边的1变成0,只要n不等于0,就至少可以进行一次与操作
         * 有多少个1,就可以进行多少次,计数操作次数
         * 也适用于负数
         */
        public static int numberOfOne_3(int n){
            if(n==0) return 0;
            int count=0;
            while (n!=0){
                count++;
                n=n&(n-1);
            }
            return count;
        }
    public static void test(int n,int number){
        System.out.println("n="+n+" 应输出:"+number+" 实际输出:");
        System.out.println("方法1:"+numberOfOne_1(n));
        System.out.println("方法2:"+numberOfOne_2(n));
        System.out.println("方法3:"+numberOfOne_3(n));
        System.out.println();
    }
    
        public static void main(String[] args) {
            test(0,0);
            test(1,1);
            test(10,2);
            test(-10,30);
            test(0x7FFFFFFF,31);
            test(0xFFFFFFFF,32);
            test(0x80000000,1);
        }
    }
    
    展开全文
  • 在二维数组中查找数

    2015-11-03 21:15:51
    题目:在一个二维数组中,每一行都按照从左到右递增顺序排序,每一都按照从上到下递增顺序排序。请完成一个 函数,输入这样一个二维数组和一个整数,判断数组中是否含有该整数。解析:题目并不是很难,最...
  • LINGO软件学习

    2009-08-08 22:36:50
    集名字必须严格符合标准命名规则:以拉丁字母或下划线(_)为首字符,其后由拉丁字母(A—Z)、下划线、阿拉伯数字(0,1,…,9)组成总长度不超过32个字符字符串,且不区分大小写。 注意:该命名规则同样适用...
  • 自动计算数独VB源码

    2015-06-28 12:38:41
    3、经第二步处理后,SY(i, j)为空,说明前面步骤出错,SY(i, j)值为一位数字,就说明该点值是唯一,可以确定了。重复第2步。 4、剩余SY(i, j)中字符串长度最少也是两位,或更多位数。随机从这些两位数SY...
  • 第一种思路,出现次数超过一半的数字,不管如何,必然这个数字位于数组中间位置,因此可以采用类似于快排划分的方法,找到位于数组中间位置的数字,然后在顺序检索是否这个数字出现次数超过一半。第二种思路...
  • 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有排列后再去 掉不满足条件排列。 【程序12】 题目:...
  • 4.3.5 说一说你对java.lang.Object对象中hashCode和equals方法的理解。在什么场景下需要重新实现这两个方法。 4.3.6 在jdk1.5中,引入了泛型,泛型的存在是用来解决什么问题。 4.3.7 这样的a.hashcode() 有什么用...
  • 思科网络技术学院教程CCNA1

    热门讨论 2013-05-28 06:37:53
     为了更便于将此书作为课程的指导用书,在每一章内,主要标题与在线课程每个模块的主要部分匹配,而主标题下的题目有略微不同。此外,本书使用了很多不同的例子,与在线课程相比更深入一些。因此,学生可以获得更...
  • 采用这种方法的考生要注意,一开始只需要阅读题目的题干,千万不要读所有的选项,一来费时间,二来那些干扰选项可能还会影响阅读文章时的正确理解。 【解题模式三】直接以问题为切入点,并不阅读全文。每做一道问题...
  • 最新Java面试宝典pdf版

    热门讨论 2011-08-31 11:29:22
    13、是否可以从一个static方法内部发出对非static方法的调用? 12 14、Integer与int的区别 13 15、Math.round(11.5)等於多少? Math.round(-11.5)等於多少? 13 16、下面的代码有什么不妥之处? 13 17、请说出作用域...
  • 13、是否可以从一个static方法内部发出对非static方法的调用? 12 14、Integer与int的区别 13 15、Math.round(11.5)等於多少? Math.round(-11.5)等於多少? 13 16、下面的代码有什么不妥之处? 13 17、请说出作用域...
  • Java面试宝典2010版

    2011-06-27 09:48:27
    13、是否可以从一个static方法内部发出对非static方法的调用? 14、Integer与int的区别 15、Math.round(11.5)等於多少? Math.round(-11.5)等於多少? 16、下面的代码有什么不妥之处? 17、请说出作用域public,...
  • java面试题

    2018-01-01 15:35:15
    84.9. 题目1:用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连. 117 84.10. 写一个方法,实现字符串反转,如:输入...
  • java 经典习题.doc

    2009-09-16 11:32:59
    题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有排列后再去 掉不满足条件排列。 【程序12】 题目:...
  • HTTP判题机可以通过账号的problem_start/problem_end限制其领取任务的题目号范围,配合judge.conf中的HTTP_DOWNLOAD=0可以让不方便更新判题数据的判题机发挥部分功效。 11-30 更新 优化s树莓派4安装脚本,修补漏洞...
  • 2.1 出SQL SELECT语句性能 36 2.1.1 SQL SELECT语句介绍 36 2.1.2 DESCRIBE表命令 36 2.1.3 SELECT语句性能 40 2.2 执行基本SELECT语句 40 2.2.1 基本SELECT语句语法 41 2.2.2 必须遵守规则 45 ...
  • 每人至少做6题,题目如下(每人的题目由任课老师安排) (1)编写一个程序实现如下功能:一个整型数组有10个元素,删除所有值为n的元素。要求: ① 主函数完成n的输入,数组元素输入以及删除后数组元素的输出。 ② ...
  • 请编一程序,用赋初值的方法使c1,c2,c3,c4,c5这5个变量值分别为’C’,’h’,’i’,’n’,’a’,经过运算,使c1,c2,c3,c4,c5值分别变为’G’,’l’,’m’,’r’,’e’,并输出。 4 3.8例2.6能否改成...
  • 网上日记本

    2013-12-30 21:34:33
    接下来对数据中心库表设计,它的方法与客户基本信息库表一样,也包括一些基本信息,如ID、分类、题目。这些最基本信息可设置成为主索引,惟一索引或候选索引,从而建立表间关系。在这个库表中还要有用户输入...
  • c++ 面试题 总结

    2009-09-16 08:44:40
    页式管理:把主存分为一页一页的,每一页的空间要比一块一块的空间小很多,显然这种方法的空间利用率要比块式管理高很多。 段式管理:把主存分为一段一段的,每一段的空间又要比一页一页的空间小很多,这种方法在...
  • 数码管接法和驱动原理 一支七段数码管实际由 8 个发光二极管构成, 其中 7 个组形构成数字 8 七段笔画, 所以称为七段 数码管,而余下 1 个发光二极管作为小数点。作为习惯,分别给 8 个发光二极管标上记号:...
  • Java 面试宝典

    2013-02-01 10:02:08
    13、是否可以从一个 static 方法内部发出对非 static 方法的调用? ........................ 13 14、Integer 与 int 的区别 .....................................................................................
  • vb学生成绩管理系统

    2013-06-28 08:55:24
     理解面向对象软件设计基本理论,学习VB软件设计基本方法,熟悉一般软件项目开发基本步骤,培养运用VB解决实际问题能力和技巧。 课程设计主要内容和要求(包括原始数据、技术参数、设计要求、工作量要求...

空空如也

空空如也

1 2
收藏数 28
精华内容 11
关键字:

列数字说明方法的题目