后台开发 3个题目 array_chunk, 100块钱找零钱(动态规划 dynamic programming), 双向循环链表 llist 删除节点
1. array_chunk 实现
http://php.net/manual/en/function.array-chunk.php
<?php
function my_array_chunk($a, $sz) {
$b = [];
if ($sz < 1) {
throw new Exception("size is less than 1");
return null;
}
for ($i = 0, $n = count($a); $i < $n; $i++) {
if ($i % $sz === 0) {
array_push($b, []);
}
array_push($b[count($b) - 1], $a[$i]);
}
return $b;
}
test:
$input_array = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h');
print_r(my_array_chunk($input_array, 3));
// print_r(my_array_chunk($input_array, 2));
test my_array_chunk()
output:
E:\code\php>php chunk.php
Array
(
[0] => Array
(
[0] => a
[1] => b
[2] => c
) [1] => Array
(
[0] => d
[1] => e
[2] => f
) [2] => Array
(
[0] => g
[1] => h
) )
php chunk.php
javascript:
Array.prototype.chunk = function(sz) {
    var a = [];
    if (sz<1) {
       	throw new Error("size is less than 1");
    }
    this.forEach(function(e, i) {
        if (i % sz === 0) {
            a.push([]);
        }
        a[a.length-1].push(e);
    });
    return a;
};
test:
var a = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'];
console.log(a.chunk(2));
console.log(a.chunk(1));
console.log(a.chunk(8));
console.log(a.chunk(10));
console.log(a.chunk(0));
test Array.prototype.chunk
output:
E:\code\js\algorithm>node array_chunk.js
[ [ 'a', 'b' ], [ 'c', 'd' ], [ 'e', 'f' ], [ 'g', 'h' ] ]
[ [ 'a' ],
[ 'b' ],
[ 'c' ],
[ 'd' ],
[ 'e' ],
[ 'f' ],
[ 'g' ],
[ 'h' ] ]
[ [ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' ] ]
[ [ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' ] ]
[ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' ]
output for Array.prototype.chunk
* golang
// HelloWorld project main.go
package main import (
"fmt"
) func array_chunk(a []string, sz int) [][]string {
var n int = len(a)/sz // 二维数组的长度
if (len(a)>n*sz) { n += 1 }
var b = make([][]string, 0, n) for i := 0; i < len(a); i++ {
offset := i % sz
if offset == 0 {
b = append(b, make([]string, sz))
}
b[len(b)-1][offset] = a[i]
}
return b
} func slice2d_toString(a [][]string) string {
s := "[" for i := 0; i < len(a); i++ {
s += "["
j := 0
for ; j < len(a[i])-1; j++ {
s += a[i][j] + ","
}
s += a[i][j] + "] "
} s += "]"
return s
} func main() {
letters := []string{"a", "b", "c", "d", "e", "f", "g"}
a2d := array_chunk(letters, 3)
fmt.Printf(slice2d_toString(a2d))
}
output:
C:/go/bin/go.exe build -i [J:/gocode/src/HelloWorld]
成功: 进程退出代码 0.
J:/gocode/src/HelloWorld/HelloWorld.exe [J:/gocode/src/HelloWorld]
[[a,b,c] [d,e,f] [g,,] ]成功: 进程退出代码 0.
go output
Java:
package cn.mediamix;
import java.util.ArrayList;
public class ArrayChunk {
	private static ArrayList<ArrayList<String>> arrayChunk(String[] input, int sz)
			throws Exception {
		ArrayList<ArrayList<String>> a = new ArrayList<ArrayList<String>>();
		if (sz < 1) {
			throw new Exception("size is less than 1");
		}
		for (int i = 0, n = input.length; i < n; i++) {
			if (i % sz == 0) {
				a.add(new ArrayList<String>());
			}
			a.get(a.size()-1).add(input[i]);
		}
		return a;
	}
	public static void main(String[] args) {
		String[] input = {"a", "b", "c", "d", "e", "f", "g", "h"};
		ArrayList<ArrayList<String>> a = null;
		try {
			a = arrayChunk(input, 3);
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println(a.toString());
	}
}
Output:
p.p1 { margin: 0; font: 14px Monaco }
[[a, b, c], [d, e, f], [g, h]]
2. 100块钱 找零钱多少种方法 50, 20, 10, 5, 1
查一下贪心算法、0/1背包问题 (343种, 但是套4层循环不是好的方法)
先看一个简单一点的问题: 93块钱找零钱,用最少的note/coins数怎么做?
function findMin(deno, v) {
    deno = deno.sort(function(a, b) {
       return b-a;
    });
    var ans = [];
    deno.forEach(function(item) {
        while (v >= item) {
            v -= item;
            ans.push(item);
        }
    });
    return ans;
}
var deno = [50, 20, 10, 5, 1];
console.log(findMin(deno, 93));
output:
[ 50, 20, 20, 1, 1, 1 ]
100块钱, 用面值 [ 50, 20, 10, 5, 1 ]的钱币, 换零钱多少种方法?
用动态规划法:
php:
<?php
function coins($deno, $v) {
$n = count($deno);
$dp = [];
for ($i = 0; $i < $n; $i++) {
$dp[$i] = []; // length: $v+1
$dp[$i][0] = 1; //第一列为1
}
for ($j = 0; $j <= $v; $j++) {
// 第一行中能够被$deno[0]整除的数,即可以被换钱,记为1
$dp[0][$j] = $j % $deno[0]===0 ? 1 : 0;
}
for ($i = 1; $i < $n; $i++) {
for ($j = 1; $j <= $v; $j++) {
$tmp = 0;
for ($k = 0; $k * $deno[$i] <= $j; $k++) {
// 累加用$k张$deno[i]货币后$dp[i-1]中组成剩下钱数的方法数
$tmp += $dp[$i-1][ $j - $k * $deno[$i] ];
}
$dp[$i][$j] = $tmp;
}
}
return $dp[$n-1][$v];
} // test
$deno = [50,20,10,5,1];
echo coins($deno, 100).PHP_EOL;
javascript:
function coins(deno, v) {
    if (deno === null || deno.length === 0 || v < 0) {
        return 0;
    }
    var dp = new Array(v + 1);
    // init
    for (var i = 0; i < dp.length; i++) {
        dp[i] = 0;
    }
    for (var j = 0; deno[0] * j <= v; j++) {
        dp[deno[0] * j] = 1;
    }
    for (i = 1; i < deno.length; i++) {
        for (j = 1; j <= v; j++) {
            dp[j] += j - deno[i] >= 0 ? dp[j - deno[i]] : 0;
        }
    }
    return dp[v];
}
// test
var deno = [50, 20, 10, 5, 1];
console.log(coins(deno, 100)); // 343
golang:
// Dynamic programming project main.go
package main import (
"fmt"
) func coin(deno []int, v int) int {
n := len(deno)
dp := make([][]int, 0, n)
for i := 0; i < n; i++ {
dp = append(dp, make([]int, v+1))
dp[i][0] = 1
}
for j := 0; j <= v; j++ {
if j%deno[0] == 0 {
dp[0][j] = 1
} else {
dp[0][j] = 0
}
}
for i := 1; i < n; i++ {
for j := 1; j <= v; j++ {
tmp := 0
for k := 0; k*deno[i] <= j; k++ {
tmp += dp[i-1][j-k*deno[i]]
}
dp[i][j] = tmp
}
}
return dp[n-1][v]
} func main() {
deno := make([]int, 0, 5)
deno = append(deno, 50, 20, 10, 5, 1) /*
for i := range deno {
fmt.Println(deno[i])
}
*/
c := coin(deno, 100)
fmt.Println(c)
}
output:
/usr/local/go/bin/go build -i [/Users/Mch/Code/golang/src/Greedy]
Success: process exited with code 0.
/Users/Mch/Code/golang/src/Greedy/Greedy [/Users/Mch/Code/golang/src/Greedy]
343
Success: process exited with code 0.
main.go output
Java:
package cn.mediamix;
public class Coins {
	public static int coins(int []deno, int v) {
		if (deno == null || deno.length == 0 || v < 0) {
			return 0;
		}
		int[] dp = new int[v+1];
		for (int j = 0; deno[0] * j <= v; j++) {
			dp[deno[0]*j] = 1;
		}
		for (int i = 1; i < deno.length; i++) {
			for (int j = 1; j <= v; j++) {
				dp[j] += j - deno[i] >= 0 ? dp[j-deno[i]] : 0;
			}
		}
		return dp[v];
	}
	public static void main(String[] args) {
		int []deno = {50, 20, 10, 5, 1};
		int solutions = Coins.coins(deno, 100);
		System.out.println(solutions);
	}
}
output: 343
3. 双向链表删除节点 (只有1个节点怎么处理)
为了让链表的元素适应任何类型, 参照内核链表. http://kernel.org
~/linux-4.17.11/include/linux/list.h
~/linux-4.17.11/include/linux/kernel.h
~/linux-4.17.11/include/linux/stddef.h
~/linux-4.17.11/include/linux/poison.h
llist.h
#ifndef llist_h
#define llist_h struct list_head {
struct list_head *next;
struct list_head *prev;
}; // #define offsetof(TYPE, MEMBER) ((size_t)&((TYPE *)0)->MEMBER) #define list_entry(ptr, type, member) \
container_of(ptr, type, member) #define container_of(ptr, type, member) ({ \
void *__mptr = (void *)(ptr); \
((type *)(__mptr - offsetof(type, member))); }) #define LIST_HEAD_INIT(name) { &(name), &(name) } #define LIST_HEAD(name) \
struct list_head name = LIST_HEAD_INIT(name) static inline void INIT_LIST_HEAD(struct list_head *list)
{
list->next = list;
list->prev = list;
} static inline void __list_add(struct list_head *new,
struct list_head *prev,
struct list_head *next)
{
next->prev = new;
new->next = next;
new->prev = prev;
prev->next = new;
} static inline void list_add_tail(struct list_head *new, struct list_head *head)
{
__list_add(new, head->prev, head);
} static inline void list_add(struct list_head *new, struct list_head *head)
{
__list_add(new, head, head->next);
} static inline void __list_del(struct list_head * prev, struct list_head * next)
{
next->prev = prev;
prev->next = next;
} static inline void __list_del_entry(struct list_head *entry)
{
// if (!__list_del_entry_valid(entry)) return;
__list_del(entry->prev, entry->next);
} #define POISON_POINTER_DELTA 0 #define LIST_POISON1 ((void *) 0x100 + POISON_POINTER_DELTA)
#define LIST_POISON2 ((void *) 0x200 + POISON_POINTER_DELTA) static inline void list_del(struct list_head *entry)
{
__list_del_entry(entry);
entry->next = LIST_POISON1;
entry->prev = LIST_POISON2;
}
main.c
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include "llist.h" struct fox {
unsigned long tail_length;
unsigned long weight;
bool is_fantastic;
struct list_head list;
}; void handler(struct fox *f) {
printf("tail length: %lu, weight=%lu, fantasic: %d\n",
f->tail_length, f->weight, f->is_fantastic?1:0);
} struct fox *list_traverse(const struct list_head *fox_list,
void (*handler)(struct fox *f)) {
// 链表指针(不包含元素)迭代器
struct list_head *p;
// 链表整个节点迭代器
struct fox *f = NULL; list_for_each(p, fox_list) {
f = list_entry(p, struct fox, list);
handler(f);
}
return f;
} int main(int argc, const char * argv[]) {
/*
struct fox *red_fox = (struct fox *)malloc(sizeof(*red_fox));
red_fox->tail_length = 40;
red_fox->weight = 6;
red_fox->is_fantastic = false;
INIT_LIST_HEAD(&red_fox->list);
*/
struct fox red_fox = {
.tail_length = 40,
.weight = 6,
.is_fantastic = false,
.list = LIST_HEAD_INIT(red_fox.list)
}; struct fox new_fox = {
.tail_length = 35,
.weight = 5,
.is_fantastic = true,
.list = LIST_HEAD_INIT(new_fox.list)
};
// 初始化表头
LIST_HEAD(fox_list);
// 添加2个节点
list_add_tail(&red_fox.list, &fox_list);
list_add_tail(&new_fox.list, &fox_list); struct fox *f = list_traverse(&fox_list, handler); // 删除最后添加的一个节点
list_del(&f->list);
printf("after deleted\n");
f = list_traverse(&fox_list, handler); // 同理再删除一个节点
list_del(&f->list);
printf("after deleted\n");
list_traverse(&fox_list, handler); return 0;
}
output:
p.p1 { margin: 0; font: 11px Menlo }
span.s1 { font-variant-ligatures: no-common-ligatures }
tail length: 40, weight=6, fantasic: 0
tail length: 35, weight=5, fantasic: 1
after deleted
tail length: 40, weight=6, fantasic: 0
after deleted
Program ended with exit code: 0
后台开发 3个题目 array_chunk, 100块钱找零钱(动态规划 dynamic programming), 双向循环链表 llist 删除节点的更多相关文章
- ACM_给你100块钱
		
给你100块钱 Time Limit: 2000/1000ms (Java/Others) Problem Description: 小光见到昨晚旭能神没拿到一血,又损失了一百块,很同情他.但是为了不 ...
 - 报表软件公司悬赏 BUG,100块钱1个的真实用意
		
上一篇文章我讲到,报表软件FineReport一反常态,做了个<提BUG,拿现金>的活动,1个BUG,100块钱.纵览软件行业,如金蝶用友浪潮IBM微软等国内外巨头,均没有这样的举动去征集 ...
 - 面试总结 | Linux后台开发不得不看的知识点(给进军bat的你!)
		
目录 一 自我介绍 二 面试情况 三 相关知识点汇总 1 c/c++相关 2 计算机网络 3 数据结构相关 4 数据库相关 5 操作系统 6 Linux基础知识及应用编程(后台必备!) 7 大数问题 ...
 - 报表软件公司高价悬赏BUG,100块1个我真是醉了
		
一直在用帆软的报表软件FineReport来做项目,也一直关注着这个公司的发展. 看到<提BUG,拿奖金>的这个活动,有些疑问和思考. 一般FineReport新版本在正式发布前,都会经过 ...
 - JAVA题目:小芳的妈妈每天给她2.5元,她都会存起来,但是,每当这一天是存钱的第五题或者5的倍数的话,她都会去用掉6块钱。 问:至少经过多少天可以存到100块?
		
1 /*题目:小芳的妈妈每天给她2.5元,她都会存起来, 2 但是,每当这一天是存钱的第五题或者5的倍数的话, 3 她都会去用掉6块钱. 4 问:至少经过多少天可以存到100块? 5 */ 6 /*分 ...
 - 学了C++不知道怎么搞后台开发?先看看这份学习路线吧!
		
作者:AJ 在去年结束的秋季招聘中,后台开发或服务器开发的岗位需求一度火热,甚至超过了算法岗.不少同学从诸神黄昏的算法岗战场上退下,转向更偏向工程能力的后台开发岗,从而造成后台开发岗位竞争的大爆发. ...
 - 携程Java后台开发三面面经
		
前言 携程是我面试的第一个互联网公司,投递的岗位是后台开发实习生,总共面了三面,止步于人才库.中间兜兜转转,复杂的心理活动,不足与外人道也.唯有面试的技术部分与大家共享. 宣讲会完了之后有个手写代码的 ...
 - SpringBoot技术栈搭建个人博客【后台开发】
		
前言:在之前,我们已经完成了项目的基本准备,那么就可以开始后台开发了,突然又想到一个问题,就是准备的时候只是设计了前台的RESTful APIs,但是后台管理我们同样也是需要API的,那么就在这一篇里 ...
 - Golang后台开发初体验
		
转自:http://blog.csdn.net/cszhouwei/article/details/37740277 补充反馈 slice 既然聊到slice,就不得不提它的近亲array,这里不太想 ...
 
随机推荐
- sqli-labs lesson1-4
			
写在前面: 前四关基本都是基于GET的SQL注入 在Mysql中有一个系统数据库information_schema,存储着所有数据库的相关信息,一般利用这个数据库进行SQL注入. 因为大部分的注入需 ...
 - SQL 练习13
			
查询没学过"张三"老师讲授的任一门课程的学生姓名 SELECT * from Student WHERE SId not in ( SELECT SC.SId from Teach ...
 - NOIP 模拟 9 分组
			
题解 这道题我们发现可以根据 \(k=1\) 和 \(k=2\) 的情况分别讨论 \(k=1\) 时,我们发现要保证字典序,那么我们从后往前扫,扫的时候判断一下当前数是否会和上一段的冲突. 复杂度瓶颈 ...
 - Longhorn,企业级云原生容器分布式存储 - 高可用
			
内容来源于官方 Longhorn 1.1.2 英文技术手册. 系列 Longhorn 是什么? Longhorn 企业级云原生容器分布式存储解决方案设计架构和概念 Longhorn 企业级云原生容器分 ...
 - 终于讲清楚了:深入理解Java 应用程序中 final 关键字的各种使用场景
			
在 Java 语言众多的关键字中,final 关键字无疑是被提到最多的,也是在面试过程中经常被问到的知识点.今天,老王查找了很多材料,最后终于收集了关于 final 关键字比较全的知识点.首先,fin ...
 - 狂神说SpringBoot02:运行原理初探
			
狂神说SpringBoot系列连载课程,通俗易懂,基于SpringBoot2.2.5版本,欢迎各位狂粉转发关注学习. 微信公众号:狂神说(首发) Bilibili:狂神说Java(视频) 未经作 ...
 - 十七:使用JDBC处理MySQL大数据
			
一.基本概念 大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据,例如图像.声音.二进制文等. 在实际开发中,有时 ...
 - 【gdal】创建GeoTiff栅格数据
			
1 //定义转换参数 2 private readonly double[] d_transform = { 69.999999999999972, 0.01, 0.0, 44.99999999999 ...
 - Bing每日壁纸的RESTful接口实现
			
0x00 存在意义 权且当作Docker打包的练习. 显然可以通过构造请求获得每天的壁纸,但是如果想要优雅地在其它地方使用这一网络资源,封装一个RESTful API将会保证整洁美观,在编写CSS等场 ...
 - Salesforce LWC学习(三十六)  Quick Action 支持选择 LWC了
			
本篇参考: https://developer.salesforce.com/docs/component-library/documentation/en/lwc/lwc.use_quick_act ...