首页 > Re: 求助:5道算法题

Re: 求助:5道算法题

http://www.newsmth.net/frames.html



发信人: cutepig (cutepig), 信区: Algorithm

标  题: 求助:5道算法题

发信站: 水木社区 (Sat Nov 10 18:25:06 2007), 站内





1)given a integer, output its previous and next neighbor number which has the same number of bit 1 in their binary representation.

(1)只想到一种很笨的方法,就是将这个数递增或者递减,直到找到一个和它1的位数一样多的为止,应该有更好的方法

(2)

满足条件的比这个数大的数应该是这个数从最低位开始,找到的第一个的01组合对调。

满足条件的比这个数小的数应该是这个数从最低位开始,找到的第一个的10组合对调。



2) Given 1 GB memory, input a file which contians 4 billion integers, output one integer that is not in the file. What if you have only 10 MB memory?

这个如果用一位表示一个数的存在与否的话,需要2^32bits=2^32/8bytes=2^29=512MB内存,用10M的话似乎只能读多次文件,每次判断某一部分数存在与否,有没有更好的办法?



3) how to divide an integer array into 2 sub-arrays and make their averages equal? e.g. a[left_portion]/left_portion_num == a[right_portion]/right_portion_num.



4)Given n unsigned integer, output 2 integers which has the maximum result after XOR.

莫非要遍历所有可能的组合?



5)Input an integer array of size n and an integer k (k<=n), output all subsets of size k.

(1)这个类似于全排列的生成算法吧,想出一个递归的回溯方法

array,n:数组和数组大小

k:子数列大小

void output(int *array,int n,int k)

{

   static int used[n];//这个静态数组记录是否该元素已经输出了,初始化为0

   static int outdata[k];//记录已经输出的元素

   if k<=0 ,return;

   对于array的每一个未输出的元素array[i]

  {

     将该元素放到outdata中,标记used[i]=1;

     如果满k个了,则输出outdata的数据

     否则,递归调用output(array,n,k-1)

     回溯,令used[i]=0;

  }

}

(2)或者写一个Next函数用来计算当前排列的下一个排列

BOOL Next(int *data,int nmax,int k)

{

int i;

#define MyMax(i) (nmax-k+i)

for (i=k-1;i>=0 ;i--)//从后向前找到第一个可以增加的数

{

ASSERT(data[i]
>=0 && data[i]<=MyMax(i));

if(data[i]<MyMax(i))

{

break;

}

}

if(i>=0)//将该位++,后面各位递增

{

data[i]
++;

for (int j=i+1;j<k;j++)

{

data[j]
=data[j-1]+1;

ASSERT(data[j]
<=MyMax(j))

}

return TRUE;

}

else

return FALSE;



}


初始化data={0,...,k-1},再一直调用Next就可以得到所有的排列

发信人: scottfield (金蛇郎君), 信区: Algorithm

标  题: Re: 求助:5道算法题

发信站: 水木社区 (Sat Nov 10 20:18:14 2007), 站内



第三个,可以参考CLRS,可以线性时间求得,是weighted-select problem

把值看成权就行了。


发信人: scottfield (金蛇郎君), 信区: Algorithm

标  题: Re: 求助:5道算法题

发信站: 水木社区 (Sat Nov 10 20:24:24 2007), 站内



第四题,XOR是 00->1 11->1是不?



则只要找出两个最高位相同的倍数最多的不就行了?



用Significant-bit Radix Sort 




发信人: ttl (小驴|主ID), 信区: Algorithm

标  题: Re: 求助:5道算法题

发信站: 水木社区 (Sat Nov 10 20:36:27 2007), 站内



【 在 wlalbert (找个打我球的女朋友) 的大作中提到: 】

如何用c++实现?

【 在 cutepig (cutepig) 的大作中提到: 】

: 似乎真的是这样呀

: 满足条件的比这个数大的数应该是这个数从最低位开始,找到的第一个的01组合对调。

: 满足条件的比这个数小的数应该是这个数从最低位开始,找到的第一个的10组合对调。

: ...................



void find(int i)

{

        int f = 3; // 11

        int pf = 2; // 10

        int nf = 1; // 01



        int p = 0; // 小

        int n = 0; // 大



        while (f < 4 * i)

        {

                int tmp = f & i;

                if (!p)

                {

                        if (0 == (tmp ^ pf))

                                p = i ^ f;

                }

                if (!n)

                {

                        if (0 == (tmp ^ nf))

                                n = i ^ f;

                }



                f  <<= 1;

                pf <<= 1;

                nf <<= 1;

        }



        cout << p << endl;

        cout << n << endl;

}

发信人: zgx03 (时间旅客), 信区: Algorithm

标  题: Re: 求助:5道算法题

发信站: 水木社区 (Sat Nov 10 21:07:26 2007), 站内



第4题这么做,

设原数组为A,里面的元素取反后形成第二个数组B,把这两个数组合起来形成数组C。

把C排一下序,找C的相邻两个分别属于A和B且二进制最高几位连续相同最多的,即可。

复杂度NlogN。



转载于:https://www.cnblogs.com/cutepig/archive/2007/11/10/955539.html

更多相关:

  •         Apache POI是一个开源的利用Java读写Excel,WORD等微软OLE2组件文档的项目。        我的需求是对Excel的数据进行导入或将数据以Excel的形式导出。先上简单的测试代码:package com.xing.studyTest.poi;import java.io.FileInputSt...

  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 要取得a到b之间的...

  • 利用本征图像分解(Intrinsic Image Decomposition)算法,将图像分解为shading(illumination) image 和 reflectance(albedo) image,计算图像的reflectance image。 Reflectance Image 是指在变化的光照条件下能够维持不变的图像部分...

  • 题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题: cl...

  • 题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:      5     /    2   6   /  1   3示例 1: 输入: [1,6,3,2,5] 输出...

  • 给定整数 n 和 k,找到 1 到 n 中字典序第 k 小的数字。 注意:1 ≤ k ≤ n ≤ 10^9。 示例 : 输入: n: 13 k: 2 输出: 10 解释: 字典序的排列是 [1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9],所以第二小的数字是 10。 字典排序数的实现...

  • 找规律题 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的: 1/1 1/2 1/3 1/4 1/5 … 2/1 2/2 2/3 2/4 … 3/1 3/2 3/3 … 4/1 4/2 … 5/1 … … 我们以Z字形给上表的每一项编号。第一项是1/1,然后是1/2,2/1,...

  • 学习计划 MyPlan11 主题:Python描述统计、简单统计图形 时间:8.5-8.11周内完成 参考资料:新书《谁说菜鸟不会数据分析python篇》 各位星友们,在这个星球里每个人都要逼迫自己学习未知的领域或知识点,每天进步一点点,积累的时间久了 ,菜鸟也能起飞。 完成情况: 在pandas中,使用describe函数进行描述统...

  • 利用SocketServer模块来实现网络客户端与服务器并发连接非阻塞通信。 首先,先了解下SocketServer模块中可供使用的类: BaseServer:包含服务器的核心功能与混合(mix-in)类挂钩;这个类只用于派生,所以不会生成这个类的实例;可以考虑使用TCPServer和UDPServer。 TCPServer/UDPS...

  • 题目:序列化二叉树 请实现两个函数,分别用来序列化和反序列化二叉树。 示例:  你可以将以下二叉树:     1    /   2   3      /     4   5 序列化为 "[1,2,3,null,null,4,5]" 解题: /*** Definition for a binary tree no...

  • sd.js  import $global from "./global"; import $g from "./sg"; import $ from "jquery"; import {Message, Loading} from "element-ui";//引入饿了么相关组件 import {Base64} from "js-...

  •     原生sd.js----------------------------------------------------------------  const API_ROOT_URL = "http://www.api.com";const $d= {_postList_url: API_ROOT_URL + "/api...